我们有一个目前使用复合(即多列)索引的表。
让我们说
PRIMARY KEY(A, B)
当然我们可以基于单独的A(最左侧索引前缀)快速搜索,如果我们想要仅基于B进行有效搜索,我们需要为B创建一个单独的索引。
我的问题是,如果我在做:
PRIMARY KEY (B)
保留
是否有任何价值PRIMARY KEY (A,B)
换句话说会有任何优势保留
PRIMARY KEY (A,B)
如果我有
PRIMARY KEY (A)
和
PRIMARY KEY (B)
答案 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)