2017-03-07 10 views
0

我有一個MySQL查詢,看起來像下面這樣:爲什麼MySql不使用我的索引以及如何避免「Using temporary; Using filesort」?

SELECT trace_access.Employe_Code, trace_access.Employe_Prenom, 
trace_access.Employe_Nom, , trace_access.Evenement_Date, trace_access.Evenement_Heure 
FROM trace_access 
INNER JOIN emp 
ON trace_access.Employe_Code = emp.Employe_CodeEmploye 
LEFT JOIN user 
ON emp.Employe_ID = user.Employe_ID 
LEFT JOIN role 
ON role.User_ID = user.User_ID 
WHERE trace_access.Employe_Nom Not Like "TEST%NU" 
ORDER BY trace_access.Evenement_Date DESC , trace_access.Evenement_Heure DESC 

表「trace_access」包含近20萬個條目。

當我解釋查詢:

explain query

我的問題是,爲什麼MySQL並沒有使用該密鑰emp表,以及如何避免「使用臨時;使用文件排序」?

我試圖力的確定是使用我的索引,但沒有奏效。 查詢持續一個小時以上,在超過8Go的/ tmp文件夾上寫入一個文件!

任何幫助?

非常感謝。

+0

我懷疑基於不是條件將使用索引,更糟糕的時候是喜歡的。但是這樣一個簡單的選擇不應該只在2000萬行上運行一小時。返回多少行? – dnoeth

+0

奇怪的事情正在發生。請爲表提供'SHOW CREATE TABLE';我懷疑數據類型不一致。 –

+0

查詢中有一個多餘的逗號','。這是你運行的實際查詢嗎? – THN

回答

0

根據您當前的執行計劃(以emp開頭),需要全表掃描,並且emp上沒有有效索引。這是有意義的,當你只有你jointrace_access後獲得行的相對較少,這可能是不是這裏的情況。

爲了防止filesort,你需要一個支持您的order by的索引。因此,如果還不存在,請添加索引trace_access(Evenement_Date, Evenement_Heure)

這可能已經足以使MySQL開始trace_access。如果沒有,請用STRAIGHT_JOIN emp替換INNER JOIN emp。這將迫使MySQL這樣做。

還添加索引emp(Employe_CodeEmploye)

根據您的資料,您可以嘗試添加Employe_Code和/或Employe_Nom爲第13和/或第4列的索引上trace_access,雖然它可能不會產生太大的影響。

相關問題