多列与多列单列索引背后的概念

时间:2016-06-23 09:21:59

标签: mysql indexing tree

我最近一直在阅读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_col1idx_col2的B树,返回2个相应的行集,然后运行INTERSECT以获得结果(mySQL Index Merge Optimization) 。在这种情况下,引擎在执行其他查询之前运行2个B树搜索。

我有另一个问题: 对于索引的B树实现,是否有INT索引使搜索比VARCHAR索引更有效?

如果有人能够指出我理解中的缺陷,我会很感激。

1 个答案:

答案 0 :(得分:0)

简答:

  • “索引合并相交”的效率低于良好的复合索引。
  • VARCHAR的效率略低于INT;不要担心。
  • PRIMARY KEY(string)更改为PRIMARY KEY(id), UNIQUE(string)通常会影响效果。
  • 您的idx_multi 概念是正确的。

这种格式的答案太长了,但我已在我的discussion of composite indexes和我的index cookbook中提供了该答案。