簡體   English   中英

為什么MySql不使用我的索引以及如何避免使用“臨時”; 使用文件排序”?

[英]Why MySql doesn't use my index and how to avoid the “Using temporary; Using filesort”?

我有一個MySql查詢,如下所示:

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”包含將近2000萬個條目。

當我解釋查詢時:

解釋查詢

我的問題是,為什么MySql不使用emp表的鍵,以及如何避免“使用臨時;使用文件排序”?

我嘗試過使用它來使用索引,但這沒有用。 查詢持續一小時或更長時間,在/ tmp文件夾中寫入一個超過8Go的文件!

有什么幫助嗎?

非常感謝。

根據您當前的執行計划(以emp開頭),需要進行全表掃描,並且emp上沒有有用的索引。 當您join trace_access之后僅獲得相對較少的行時,這可能是trace_access ,這里可能不是這種情況。

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

這可能已經足以使MySQL以trace_access 如果不是,請將INNER JOIN emp替換為STRAIGHT_JOIN emp 這將迫使MySQL這樣做。

同時為emp(Employe_CodeEmploye)添加一個索引。

根據您的數據,您可以嘗試將Employe_Code和/或Employe_Nom作為第三列和/或第四列添加到trace_access的索引中,盡管可能不會產生太大影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM