【发布时间】:2020-03-07 09:50:30
【问题描述】:
我有一个带有 created_on 字段的表,该字段由自身编制索引。当查看一个慢查询时,我意识到根据我返回的列不使用索引。在以下两个示例中,我有 foo 和 bar 列。
-
foo是具有其他三列的另一个索引的一部分。 -
bar根本没有被编入索引。
EXPLAIN SELECT created_on, foo FROM T1
WHERE created_on > NOW() - INTERVAL 5 DAY;
未使用索引,搜索了 +3 百万行。 (Using where)
如果我添加一个LIMIT 子句,它将使用索引。
EXPLAIN SELECT created_on, foo FROM T1
WHERE created_on > NOW() - INTERVAL 5 DAY
LIMIT 1000;
如果使用另一列 bar 它也将使用索引。
EXPLAIN SELECT created_on, bar FROM T1
WHERE created_on > NOW() - INTERVAL 5 DAY;
使用了索引,只搜索了 150 万行。 (Using where; Using index)
为什么 MySQL 会跳过这些查询之一的索引?
【问题讨论】:
-
问题是如果一半的行符合过滤条件,为什么要使用索引。
-
@GordonLinoff 对不起,我不明白。查询之间的唯一区别是我是返回附加列
A还是B。为什么这会改变使用索引来过滤结果(WHERE 子句)? -
。 .索引通常用于减少正在读取的数据页数。根据您的描述,您的查询不会发生这种情况,因此在任何情况下都使用非覆盖索引令人惊讶。一个例外是聚集索引,但我希望它总是被使用。
标签: mysql sql indexing mariadb