我對我的應用程序有一個完整的噩夢。我之前沒有處理過這麼大的數據集,而且我的查詢要麼超時,要麼花時間回報一些東西。我有一種感覺,我的方法是完全錯誤的。MySQL查詢速度太慢或超時
我有一個payments
表和postcode
字段(等等)。它有大約40,000行(每筆交易一個)。它在郵編外鍵上有一個auto-inc PRIMARY鍵和一個INDEX。
我也有一個postcodes
查詢表,2,500,000行。桌子是這樣構成的;
postcode | country | county | localauthority | gor
AB1 1AA S99999 E2304 X 45
AB1 1AB S99999 E2304 X 45
郵政編碼字段是主要的,我在所有其他領域的索引。
每個字段(除了郵編)都有一個查找表。在country
的情況下是這樣的;
code | description
S99999 Wales
應用程序的一點是,用戶可以選擇感興趣的區域(如「英格蘭」,「倫敦」,「英格蘭西南部」等),並顯示這些區域的支付結果。
爲此,當用戶選擇他們感興趣的區域時,我創建了一個臨時表,其中一行列出了所選區域的所有郵編。然後我將它加入我的付款表。
問題是,如果用戶選擇一個大區域(如「英格蘭」),那麼我必須創建一個大規模臨時表(或約100萬行),然後將其與40,000個支付款項進行比較以決定要顯示哪個。
UPDATE
這裏是我的代碼;
$generated_temp_table = "selected_postcodes_".$timestamp_string."_".$userid;
$temp_table_data = $temp_table
->setTempTable($generated_temp_table)
->newQuery()
->with(['payment' => function ($query) use ($column_values) {
$query->select($column_values);
}])
;
這是我試圖打印出原始查詢;
$sql = str_replace(['%', '?'], ['%%', "'%s'"], $temp_table_data->toSql());
$fullSql = vsprintf($sql, $temp_table_data->getBindings());
print_r($fullSql);
這是結果;
select * from `selected_postcodes_1434967426_1`
這看起來不是正確的查詢,我無法計算出Eloquent在這裏做了什麼。我不知道爲什麼完整的查詢不打印出來。
您的查詢是在哪裏? –
沒有看到您的查詢我猜左邊的聯接可能是問題。你爲什麼需要這個?當您對付款完成感興趣時,您可以使用正常的JOIN來代替? – Olli
添加查詢以及解釋計劃..'解釋選擇...' –