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

Can I add a compound unique key if one of the fields is already unique

在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) 已经具有唯一索引?还是不是,这种重复的唯一索引确实有某种原因?

是的,你可以。但这没有意义。但是,让我们分析一下是怎么回事。

INDEXUNIQUE 或不是)是一个 BTree,有助于在 table.

中查找

一个UNIQUE索引既是一个索引又是一个"constraint"表示不应有任何重复.

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

依次添加UNIQUE(sku, x):

  • 不提供任何额外的唯一性约束,
  • 不提供任何额外的索引功能,除了...
  • 是否提供可能有用的 "covering" 索引 if SELECT 中提到的唯一两列是 skux。即便如此,您也可以将其设为 INDEX 而不是 UNIQUE 因为 ...
  • 每个INSERT都必须做一些额外的努力来防止"duplicate key"。 (好的,INSERT 代码不够智能,无法看到您有 UNIQUE(sku)。)

如果那是你的完整 table,没有 很好的理由让 id AUTO_INCREMENT;你不妨将 sku 提升为 PRIMARY KEY。 (一个PK就是一个UNIQUE KEY。)

此外...如果,另一方面,您建议 UNIQUE(x, sku),则存在细微差别。这为您提供了一种通过 x 有效查找的方法——xx=constant AND sku BETWEEN ... 的范围,或 (sku, x) 未提供的某些其他内容。 索引中的顺序很重要。但是,同样,它也可能是 INDEX(x, sku),而不是 UNIQUE

因此,table 所呈现的 的最佳索引集不是 3 个索引,而是 1:

PRIMARY KEY(sku)

还有一点要注意:使用 InnoDB,PK 在 BTree 中与数据 "clustered"。即按PK查找效率很高。当需要遍历一个"secondary index"时,有两步:先下钻secondary index的BTree找到PK,下钻PK的BTree