我们有一个目前正在使用复合(即多列)索引的表。比如说
PRIMARY KEY(A, B)
当然,我们可以单独基于a(最左边的索引前缀)快速搜索,如果我们想单独基于b高效地搜索,我们需要为b创建一个单独的索引。我的问题是如果我在做:
PRIMARY KEY (B)
保留有什么价值吗
PRIMARY KEY (A,B)
换言之,有什么好处吗
如果我有
PRIMARY KEY (A)
以及
qgzx9mmu1#
你不能有多个主键,所以我假设你真的在问一个普通的索引。如果你有索引 (A, B) ,它将用于同时使用两列的查询,如:
(A, B)
WHERE A = 1 AND B = 2
以及只使用 A :
A
WHERE A = 3
但是如果你有一个查询 B ,例如。
B
WHERE B = 4
它将根本无法使用索引。如果需要优化这些查询,还应该在 B . 所以你可能有:
UNIQUE KEY (A, B) INDEX (B)
k2arahey2#
你错过了一个关于 PRIMARY KEY --根据定义(至少在mysql中是这样), UNIQUE . 并且没有比使pk唯一所需的更多的列。如果 B ,独自一人 is unique, then have 主键(b)主键定义中没有任何其他列。 如果A` 也是独一无二的,那就做吧
PRIMARY KEY
UNIQUE
is unique, then have
主键定义中没有任何其他列。 如果
PRIMARY KEY(B), UNIQUE(A)
或者交换。有关创建索引的详细讨论,请参阅我的食谱。如果这两个列都是“唯一的”,那么您可能需要
PRIMARY KEY(A, B), INDEX(B)
或
PRIMARY KEY(B, A), INDEX(A)
直到你得到 SELECTs ,很难知道要创建什么索引。
SELECTs
2条答案
按热度按时间qgzx9mmu1#
你不能有多个主键,所以我假设你真的在问一个普通的索引。
如果你有索引
(A, B)
,它将用于同时使用两列的查询,如:以及只使用
A
:但是如果你有一个查询
B
,例如。它将根本无法使用索引。如果需要优化这些查询,还应该在
B
. 所以你可能有:k2arahey2#
你错过了一个关于
PRIMARY KEY
--根据定义(至少在mysql中是这样),UNIQUE
. 并且没有比使pk唯一所需的更多的列。如果
B
,独自一人is unique, then have
主键(b)主键定义中没有任何其他列。 如果
A` 也是独一无二的,那就做吧或者交换。
有关创建索引的详细讨论,请参阅我的食谱。
如果这两个列都是“唯一的”,那么您可能需要
或
直到你得到
SELECTs
,很难知道要创建什么索引。