【发布时间】:2016-06-23 09:21:59
【问题描述】:
我最近一直在阅读有关 mySQL 索引的内容,想看看我对多索引的理解是否正确。我主要使用 InnoDB。
我将使用以下查询作为示例:
SELECT * FROM tbl_test WHERE col1=X AND col2=Y
多栏索引
假设有一个索引:
CREATE INDEX idx_multi ON tbl(col1,col2,col3)
整个索引以某种方式连接起来(最简单的方法是在中间添加一个分隔符,例如逗号)并将它们直接存储到 B-tree 中。 B-tree 的结构强制从左到右进行索引检查(因为索引现在存储为字符串?
多个单列索引
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 树,分别返回两组行,然后运行INTERSECT 以获得结果(mySQL 索引合并优化)。在这种情况下,引擎会在执行附加查询之前运行 2 次 B 树搜索。
我还有一个问题: 对于索引的 B-tree 实现,INT 索引是否比 VARCHAR 索引更高效?
如果有人能指出我理解中的缺陷,我将不胜感激。
【问题讨论】: