![](/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.