根据我对多列索引的理解,它们仅在使用从左侧开始且不跳过任何列时才有用。例如,当你有(a, b, c)
的索引时,你可以查询a
、a, b
或a, b, c
。
但是今天我发现,当有一个索引(BTREE
在InnoDB表上(时:
some_varchar, some_bigint, other_varchar
我可以查询:
SELECT MAX(some_bigint) FROM the_table
它的计划说:
id: 1
select_type: SIMPLE
table: the_table
type: index
possible_keys: NULL
key: index_some_varchar_some_bigint_other_varchar
key_len: 175
ref: NULL
rows: 1
Extra: Using index
这似乎与文档不一致。这也令人困惑,因为key
已设置,但possible_keys
没有。
这在实践中是如何运作的?如果键按some_varchar
排序,(或其前缀(,MySQL如何从中获取第二列的MAX
?
(猜测是MySQL收集有关索引中所有列的一些额外信息,但如果这是真的 - 是否可以直接看到它?
我对索引的理解是正确的,但对Using index
含义的理解是错误的。
Using index
并不一定意味着该值是通过快速查找访问的。它只是意味着未访问行数据。当type
index
并且Extra
Using index
时,仍然意味着正在扫描整个索引:
从文档中:
索引连接类型与 ALL 相同,只是扫描了索引树。
对于实际使用索引前缀的MAX
查找,解释如下所示:
id: 1
select_type: SIMPLE
table: NULL
type: NULL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: NULL
Extra: Select tables optimized away