如果其中一个字段已经是唯一的,我可以添加复合唯一键

时间:2017-04-20 21:50:43

标签: mysql schema unique-constraint unique-key unique-index

在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`)
)

在字段组合(skubusiness_classification_id)上添加唯一键是不必要的过度杀伤,其中一个(sku)已经有唯一索引?或者不是,并且确实存在某种重复唯一索引的原因?

1 个答案:

答案 0 :(得分:1)

是的,你可以。但它没有意义。但是,让我们分析一下发生了什么。

INDEXUNIQUE或不是{)是一个促进表中查找的BTree。

UNIQUE索引既是索引又是"约束"说不会有任何重复

您已经说过UNIQUE(sku)了。这提供了索引和唯一性约束。

按顺序添加UNIQUE(sku, x)

  • 不提供任何其他唯一性约束,
  • 不提供任何其他索引功能, ...
  • 提供"覆盖"可能有用的索引如果 SELECT中提及的唯一两列是skux。即便如此,您可以将其设为INDEX而不是UNIQUE,因为 ......
  • 每个INSERT必须做一些额外的努力来防止"重复密钥"。 (好的,INSERT代码不够智能,无法看到您有UNIQUE(sku)。)

如果这是您的完整表格,则没有有充分的理由拥有id AUTO_INCREMENT;您也可以将sku宣传为PRIMARY KEY。 (PK是UNIQUE KEY。)

此外......另一方面,如果你建议UNIQUE(x, sku),那么就会有一点不同。这为您提供了一种通过x高效查找的方法 - xx=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。