![](/img/trans.png)
[英]MySQL performance, inner join, how to avoid Using temporary and filesort
[英]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.