在MySQL中,以下陈述是否有意义?
CREATE TABLE `sku_classification` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sku` int(10) unsigned NOT NULL,
`business_classification_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `IDX_SKU_BUSINESS_CLASSIFICATION` (`sku`,`business_classification_id`),
UNIQUE KEY `sku` (`sku`)
)
在字段组合(sku
,business_classification_id
)上添加唯一键是不必要的过度杀伤,其中一个(sku
)已经有唯一索引?或者不是,并且确实存在某种重复唯一索引的原因?
答案 0 :(得分:1)
是的,你可以。但它没有意义。但是,让我们分析一下发生了什么。
INDEX
(UNIQUE
或不是{)是一个促进表中查找的BTree。
UNIQUE
索引既是索引又是"约束"说不会有任何重复。
您已经说过UNIQUE(sku)
了。这提供了索引和唯一性约束。
按顺序添加UNIQUE(sku, x)
:
SELECT
中提及的唯一两列是sku
和x
。即便如此,您可以将其设为INDEX
而不是UNIQUE
,,因为 ...... INSERT
必须做一些额外的努力来防止"重复密钥"。 (好的,INSERT
代码不够智能,无法看到您有UNIQUE(sku)
。)如果这是您的完整表格,则没有有充分的理由拥有id AUTO_INCREMENT
;您也可以将sku
宣传为PRIMARY KEY
。 (PK是UNIQUE KEY
。)
此外......另一方面,如果你建议UNIQUE(x, sku)
,那么就会有一点不同。这为您提供了一种通过x
高效查找的方法 - x
或x=constant AND sku BETWEEN ...
或(sku, x)
未提供的某些其他内容。 订单在索引中很重要。但是,同样,它可能是INDEX(x, sku)
,而不是UNIQUE
。
因此,表所呈现的的最佳索引集不是3个索引,而是1:
PRIMARY KEY(sku)
还有一点需要注意:使用InnoDB,PK是"群集"在BTree中有数据。也就是说,通过PK查询是非常有效的。当你需要通过"二级索引"时,有两个步骤:首先深入查看二级索引的BTree以找到PK,然后深入了解PK& #39; s BTree。