【问题标题】:Concept behind multi-column vs. multiple single-column indexing多列与多个单列索引背后的概念
【发布时间】: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_col1idx_col2 的B 树,分别返回两组行,然后运行INTERSECT 以获得结果(mySQL 索引合并优化)。在这种情况下,引擎会在执行附加查询之前运行 2 次 B 树搜索。

我还有一个问题: 对于索引的 B-tree 实现,INT 索引是否比 VARCHAR 索引更高效?

如果有人能指出我理解中的缺陷,我将不胜感激。

【问题讨论】:

    标签: mysql indexing tree


    【解决方案1】:

    简短回答:

    • “索引合并相交”的效率低于良好的复合索引。
    • VARCHAR 的效率只比INT 低一点;别担心。
    • PRIMARY KEY(string) 更改为PRIMARY KEY(id), UNIQUE(string) 通常会影响性能。
    • 你的idx_multi概念是正确的。

    长答案对于这种格式来说太长了,但我已经在我的discussion of composite indexes 和我的index cookbook 中提供了它。

    【讨论】:

      猜你喜欢
      • 2018-07-27
      • 2020-05-06
      • 1970-01-01
      • 2017-01-10
      • 2011-11-07
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多