2015-03-02 118 views
0

我寫了一個查詢,並在本地工作正常。當它是生活我得到這個錯誤:如何讓我的MySQL查詢與許多左連接執行得更快?

ERROR 1104: The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok

我已經加入SET SQL_BIG_SELECTS=1;。它現在正在工作,但運行速度非常緩慢。任何一個可以整理我的查詢,ege而不是LEFT JOIN使用另一種方法。 這是我的查詢:

SELECT sh.*, 
     ps.provider_name, 
     ps.photo_path AS photo 
FROM scholarship sh 
     left join cat_category_sch ccs 
       ON ccs.scholar_id = sh.id 
     left join elg_countries_sch elg 
       ON elg.scholar_id = sh.id 
     left join study_level_sch sls 
       ON sls.scholar_id = sh.id 
     left join taken_country_sch tcs 
       ON tcs.scholar_id = sh.id 
     left join providers ps 
       ON ps.id = sh.provider 
     left join countires c1 
       ON c1.id = elg.county_id 
     left join countires c2 
       ON c1.id = tcs.county_id 
     left join study_level sl 
       ON sl.id = sls.study_level_id 
WHERE sh.status = 1 
     AND sh.ain_status = 1 
     AND sh.deadline >= Date_sub(Now(), interval 1 year) 
GROUP BY sh.id 
ORDER BY sh.id DESC 

在此先感謝

+0

對於初學者...最後三個左連接似乎沒有用,你沒有使用這些數據,所以你不需要使用它們。這可以改善查詢的運行時間。 – 2015-03-02 12:45:39

+1

向我們展示表結構(使用任何索引)並針對查詢運行EXPLAIN以顯示MySQL如何執行它 – 2015-03-02 12:45:55

+0

最後3個連接也是必需的,因爲在某些情況下,我已經使用了條件基於這些表的位置,所以我把它放在上面的查詢我刪除了一些條件。在每個表中,我維護索引(自動增量),如ID – 2015-03-02 12:55:59

回答

0

LEFT意味着「正確」表並沒有一個「匹配」行。然而,你不用IS NULL或IS NOT NULL檢查是否存在。那麼,我懷疑LEFT是不必要的? (由於(1)它可能會分散實際問題並且(2)它可能減慢查詢的速度)。

如果需要LEFT,那麼ON tcs.scholar_id = sh.id需要scholar_id上的索引。 (等)

此外,複合索引INDEX(status, ain_status, deadline)可能會有所幫助。

+0

感謝您的更新,但我不知道 – 2015-03-03 06:58:04

+0

1.添加我建議的索引。 2.向我們介紹爲什麼你使用了LEFT JOIN而不是JOIN。 – 2015-03-03 07:04:24

+0

謝謝@rick。在具有索引的每個表中,即** id **(自動遞增)。並且我不知道哪一個更好或者是LEFT JOIN或JOIN – 2015-03-03 09:46:49