ORDER BY的MySQL索引,WHERE中包含日期范围

时间:2015-03-10 21:38:41

标签: mysql sql query-optimization

假设您有一个包含以下列的表:

id
date
col1

我希望能够使用特定的id和日期查询此表,并且还可以通过其他列进行排序。例如,

SELECT * FROM TABLE WHERE id = ? AND date > ? ORDER BY col1 DESC

根据this范围文档,索引在点击>运算符后将停止使用。但是根据文档的this顺序,如果索引按索引的最后一列排序,则索引只能用于优化order by子句。是否可以在此查询的每个部分上获得索引查找,或者您只能获得3个中的2个?我能做的比index (id, date)好吗?

1 个答案:

答案 0 :(得分:4)

计划A:INDEX(id, date) - 如果过滤掉大量行,则效果最佳,使后续的“filesort”成本不高。

计划B:INDEX(col1),如果WHERE子句过滤了很少的行,这可能效果最好。这避免了文件排序,但不一定比这里的其他选择更快。

计划C:INDEX(id, date, col1) - 如果查询未引用任何其他字段,则这是“覆盖”索引。这里的潜在优势是只查看索引,而不必触及数据。如果适用,则计划C优于计划A.

您尚未提供足够的信息来说明哪些指标最有效。如果“覆盖”适用,建议你添加C和B;否则添加A和B.查看Optimizer选择的索引。 (优化器仍有可能不会选择'正确'。)

(这三个索引是我的Index blog建议的。)