【问题标题】:MySQL: Composite Index vs Multiple Indices (Leftmost Index Prefixes)MySQL:复合索引与多个索引(最左边的索引前缀)
【发布时间】:2018-11-21 06:54:50
【问题描述】:

我们有一个表当前正在使用复合(即多列)索引。

我们说

PRIMARY KEY(A, B)

当然,我们可以仅基于 A 快速搜索(Leftmost Index Prefix),如果我们想仅基于 B 高效搜索,我们需要为 B 创建单独的索引。

我的问题是,如果我这样做:

PRIMARY KEY (B)

保留有什么价值吗

PRIMARY KEY (A,B)

换句话说会有什么优势保留下来

PRIMARY KEY (A,B)

如果我有

PRIMARY KEY (A)

PRIMARY KEY (B)

【问题讨论】:

标签: mysql indexing


【解决方案1】:

你不能有多个主键,所以我假设你真的问的是有一个普通的索引。

如果您在(A, B) 上有索引,它将用于同时使用两列的查询,例如:

WHERE A = 1 AND B = 2

以及只使用A的查询:

WHERE A = 3

但如果您的查询只使用B,例如

WHERE B = 4

它根本无法使用索引。如果您需要优化这些查询,您还应该在B 上有一个索引。所以你可能有:

UNIQUE KEY (A, B)
INDEX (B)

【讨论】:

    【解决方案2】:

    你错过了关于PRIMARY KEY 的一个关键点——根据定义(至少在 MySQL 中),UNIQUE。并且列数不要超过使 PK 唯一所需的列数。

    如果B,单独is unique, then havePRIMARY KEY(B)`PK 定义中没有任何其他列。

    如果A也是唯一的,那么做

    PRIMARY KEY(B),
    UNIQUE(A)
    

    或交换它们。

    有关创建索引的详细讨论,请参阅my cookbook

    如果需要 两列 为“唯一”,那么您可能需要

    PRIMARY KEY(A, B),
    INDEX(B)
    

    PRIMARY KEY(B, A),
    INDEX(A)
    

    在您拥有SELECTs 之前,很难知道要创建哪些索引。

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 2012-11-16
      相关资源
      最近更新 更多