我最近一直在阅读mySQL索引,并希望了解我对多索引的理解是否正确。我主要使用InnoDB。
我将使用以下查询作为示例:
SELECT * FROM tbl_test WHERE col1=X AND col2=Y
多列索引
假设有一个索引:
CREATE INDEX idx_multi ON tbl(col1,col2,col3)
整个索引以某种方式连接(最简单的是在中间添加分隔符,例如逗号)并将它们直接存储到B树中。 B树的结构强制从左到右进行索引检查(因为索引现在存储为字符串?< - 有人可以钻研这个吗?)因此,只有一个B树搜索idx_multi
。
多个单列索引
CREATE INDEX idx_col1 ON tbl(col1)
CREATE INDEX idx_col2 ON tbl(col2)
CREATE INDEX idx_col3 ON tbl(col3)
Parser搜索idx_col1
和idx_col2
的B树,返回2个相应的行集,然后运行INTERSECT
以获得结果(mySQL Index Merge Optimization) 。在这种情况下,引擎在执行其他查询之前运行2个B树搜索。
我有另一个问题: 对于索引的B树实现,是否有INT索引使搜索比VARCHAR索引更有效?
如果有人能够指出我理解中的缺陷,我会很感激。
答案 0 :(得分:0)
简答:
VARCHAR
的效率略低于INT
;不要担心。PRIMARY KEY(string)
更改为PRIMARY KEY(id), UNIQUE(string)
通常会影响效果。idx_multi
概念是正确的。这种格式的答案太长了,但我已在我的discussion of composite indexes和我的index cookbook中提供了该答案。