2015-06-22 381 views
0

我對我的應用程序有一個完整的噩夢。我之前沒有處理過這麼大的數據集,而且我的查詢要麼超時,要麼花時間回報一些東西。我有一種感覺,我的方法是完全錯誤的。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在這裏做了什麼。我不知道爲什麼完整的查詢不打印出來。

+3

您的查詢是在哪裏? –

+0

沒有看到您的查詢我猜左邊的聯接可能是問題。你爲什麼需要這個?當您對付款完成感興趣時,您可以使用正常的JOIN來代替? – Olli

+0

添加查詢以及解釋計劃..'解釋選擇...' –

回答

0

如果你有太多的結果像100萬,那麼使用偏移限制的概念。然後它將爲您節省查詢時間。還要確保你選擇的查詢只是過濾了必填字段(避免從XXXX選擇*,使用XXX中的選擇A,B)。