为什么MySql没有';t使用我的索引以及如何避免;使用临时设备;使用filesort";?
我有一个MySql查询,如下所示:为什么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
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
;我怀疑数据类型不一致。查询中有多余的逗号“”。这是您实际运行的查询吗?