MySQL 日期范围在 WHERE 中的 ORDER BY 的索引

MySQL Index for ORDER BY with Date Range in WHERE

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

id
date
col1

我希望能够使用特定的 ID 和日期查询此 table,并按另一列排序。例如,

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

根据 this range documentation, an index will stop being used after it hits the > operator. But according to this order by 文档,如果索引按索引中的最后一列排序,则只能使用索引优化 order by 子句。是否可以对该查询的每个部分进行索引查找,或者您只能获得 3 个中的 2 个?我能做得比 index (id, date) 更好吗?

计划 A:INDEX(id, date) -- 如果它过滤掉很多行时效果最好,使后续 "filesort" 成本不是很高。

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

计划 C:INDEX(id, date, col1) -- 这是一个 "covering" 索引 如果 查询不引用任何其他字段。这里的潜在优势是只看索引,而不必接触数据。如果适用,方案C优于方案A。

您没有提供足够的信息来判断这些索引中哪个最有效。如果 "covering" 适用,建议您添加 C 和 B;否则添加 A 和 B。查看优化器选择的索引。 (优化器仍有可能不会选择 'right'。)

(这三个指标是我Index blog推荐的。)