MySQL:综合指数与多个指数(最左侧索引前缀)

时间:2018-06-12 00:10:17

标签: mysql indexing

我们有一个目前使用复合(即多列)索引的表。

让我们说

PRIMARY KEY(A, B)

当然我们可以基于单独的A(最左侧索引前缀)快速搜索,如果我们想要仅基于B进行有效搜索,我们需要为B创建一个单独的索引。

我的问题是,如果我在做:

PRIMARY KEY (B)

保留

是否有任何价值
PRIMARY KEY (A,B)

换句话说会有任何优势保留

PRIMARY KEY (A,B)

如果我有

PRIMARY KEY (A)

PRIMARY KEY (B)

2 个答案:

答案 0 :(得分:1)

您遗漏了关于PRIMARY KEY的关键点 - 根据定义(至少在MySQL中),UNIQUE。并且没有比使PK独特所需的列更多的列。

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

如果A 唯一,那么请执行

PRIMARY KEY(B),
UNIQUE(A)

或交换它们。

有关创建索引的更长时间的讨论,请参阅my cookbook

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

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

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

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

答案 1 :(得分:0)

您不能拥有多个主键,因此我会假设您真的要求拥有普通索引。

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

WHERE A = 1 AND B = 2

以及仅使用A的查询:

WHERE A = 3

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

WHERE B = 4

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

UNIQUE KEY (A, B)
INDEX (B)