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)