为什么MySql没有';t使用我的索引以及如何避免;使用临时设备;使用filesort";?

为什么MySql没有';t使用我的索引以及如何避免;使用临时设备;使用filesort";?,mysql,sql,performance,indexing,sql-order-by,Mysql,Sql,Performance,Indexing,Sql Order By,我有一个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_CodeE

我有一个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表的键,以及如何避免“使用临时;使用filesort”

我试着用我的索引来冻结它,但没用。 查询持续一个多小时,在/tmp文件夹中写入超过8Go的文件

有什么帮助吗


非常感谢。

对于您当前的执行计划(从
emp
开始),需要进行完整的表扫描,并且
emp
上没有有用的索引。当您在
连接
跟踪访问
后只获得相对较少的行时,这是有意义的,这里可能不是这种情况

要防止
文件排序
,您需要一个支持您的
排序依据
的索引。因此,如果它还不存在,那么添加索引
跟踪访问(Evenement\u Date,Evenement\u Heure)

这可能已经足够让MySQL从
跟踪访问开始了。如果不是,则将
内部连接emp
替换为
直联emp
。这将迫使MySQL这样做

还为
emp(Employe\u codemploye)
添加索引


根据您的数据,您可以尝试将
Employe\u code
和/或
Employe\u Nom
添加到
trace\u access
上的索引的第3列和/或第4列,尽管这可能不会有太大影响。

我怀疑基于not的条件是否会使用索引,如果是类似的情况,则更糟。但是像这样一个简单的选择不应该只在2000万行上运行一个小时。返回了多少行?发生了一些奇怪的事情。请为表格提供
SHOW CREATE TABLE
;我怀疑数据类型不一致。查询中有多余的逗号“”。这是您实际运行的查询吗?