gpt4 book ai didi

mysql - 为什么 MySql 不使用我的索引以及如何避免 "Using temporary; Using filesort"?

转载 作者:行者123 更新时间:2023-11-29 19:16:44 24 4
gpt4 key购买 nike

我有一个如下所示的 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 万个条目。

当我解释查询时:

explain query

我的问题是为什么MySql不使用emp表的键以及如何避免“使用临时;使用文件排序”??

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

有什么帮助吗?

非常感谢。

最佳答案

根据您当前的执行计划(从 emp 开始),需要进行全表扫描,并且 emp 上没有有用的索引。当您在 jointrace_access 后仅获得相对少量的行时,这可能是有意义的,但这里的情况可能并非如此。

为了防止文件排序,您需要一个支持排序依据的索引。因此,如果尚不存在,请添加索引 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 上的索引中>,虽然可能不会有太大影响。

关于mysql - 为什么 MySql 不使用我的索引以及如何避免 "Using temporary; Using filesort"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42644381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com