为什么 MySql 不使用我的索引以及如何避免 "Using temporary; Using 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

table“trace_access”包含近 2000 万条条目。

当我解释查询时:

explain query

我的问题是为什么 MySql 没有使用 emp table 的密钥以及如何避免“使用临时文件;使用文件排序”??

我试图强制它使用我的索引,但没有成功。 查询持续一个多小时,在 /tmp 文件夹中写入超过 8Go 的文件!!!

有什么帮助吗?

非常感谢。

根据您当前的执行计划(从 emp 开始),需要进行完整的 table 扫描并且 emp 上没有有用的索引。当您在 jointrace_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 and/or Employe_Nom 作为第 3 and/or 第 4 列添加到 trace_access 上的索引中,不过它可能不会有太大影响。