MySQL:复合索引与多索引(最左边的索引前缀)

MySQL:复合索引与多索引(最左边的索引前缀),mysql,indexing,Mysql,Indexing,我们有一个目前正在使用复合(即多列)索引的表 比方说 PRIMARY KEY(A, B) 当然,我们可以单独基于A(最左边的索引前缀)快速搜索,如果我们想单独基于B高效搜索,我们需要为B创建一个单独的索引 我的问题是,如果我正在做: PRIMARY KEY (B) 保留有什么价值吗 PRIMARY KEY (A,B) 换句话说有什么好处吗 PRIMARY KEY (A,B) 如果我有 PRIMARY KEY (A) 及 你不能有多个主键,所以我假设你真的想要一个普通的索引 如果您在(A

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

比方说

PRIMARY KEY(A, B)
当然,我们可以单独基于A(最左边的索引前缀)快速搜索,如果我们想单独基于B高效搜索,我们需要为B创建一个单独的索引

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

PRIMARY KEY (B)
保留有什么价值吗

PRIMARY KEY (A,B)
换句话说有什么好处吗

PRIMARY KEY (A,B)
如果我有

PRIMARY KEY (A)


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

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

WHERE A = 1 AND B = 2
以及仅使用
A
的查询:

WHERE A = 3
但是如果您有一个只使用
B
的查询,例如

WHERE B = 4
它将根本无法使用索引。如果需要优化这些查询,还应该在
B
上设置索引。所以你可能有:

UNIQUE KEY (A, B)
INDEX (B)

您缺少一个关于
主键的关键点
——它是根据定义(至少在MySQL中是这样),
唯一的
。并且列数不超过使PK唯一所需的列数

如果
B
,只有
是唯一的,则在主键定义中有
主键(B)`而没有任何其他列

如果
A
也是唯一的,则执行以下操作

PRIMARY KEY(B),
UNIQUE(A)
或者交换它们

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

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

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


在选择
之前,很难知道要创建哪些索引。

一个表中不能有多个主键约束。主键的作用是定义可用于单独选择任何行的列。可能重复的主键可能会将主键与索引混淆。
PRIMARY KEY(A, B),
INDEX(B)
PRIMARY KEY(B, A),
INDEX(A)