为什么 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
上没有有用的索引。当您在 join
到 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
and/or Employe_Nom
作为第 3 and/or 第 4 列添加到 trace_access
上的索引中,不过它可能不会有太大影响。
我有一个 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
上没有有用的索引。当您在 join
到 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
and/or Employe_Nom
作为第 3 and/or 第 4 列添加到 trace_access
上的索引中,不过它可能不会有太大影响。