有以下查询
select count(*)
from my_table my_t
where my_t.c1 = '3' and my_t.c2 = '123'
此表在(c1,c2)上有索引,这两列都有not null
约束。
其执行计划:
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, my_t, ref, my_idx, my_idx, 157, const,const, 1, Using where; Using index
它用于何处,但出于何种目的?由于两列都不为null,因此index肯定会包含所有记录,只需要对它们进行计数。
我错过了什么吗?
答案 0 :(得分:2)
使用索引
仅使用索引树中的信息从表中检索列信息,而无需执行额外的搜索来读取实际行。当查询仅使用属于单个索引的列时,可以使用此策略。
如果
Extra
列也显示Using where
,则表示该索引用于执行键值的查找。如果没有Using where
,优化器可能正在读取索引以避免读取数据行但不使用它进行查找。例如,如果索引是查询的覆盖索引,则优化程序可以扫描它而不使用它进行查找。
据我所知,Using index
仅表示读取key
列中指定的索引足以获得计算结果所需的所有数据;没有必要读取表数据。它没有说明如何使用索引信息。
Using where
表示将从key
列中提到的索引读取的值与输出的ref
列中指示的列或常量的值进行比较。 ref
列包含const, const
,因为用于比较的值是字符串常量('3'
和'123'
)。