繁体   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