如果其中一个字段已经是唯一的,我可以添加一个复合唯一键吗
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
) 已经具有唯一索引?还是不是,这种重复的唯一索引确实有某种原因?
是的,你可以。但这没有意义。但是,让我们分析一下是怎么回事。
INDEX
(UNIQUE
或不是)是一个 BTree,有助于在 table.
中查找
一个UNIQUE
索引既是一个索引又是一个"constraint"表示不应有任何重复.
您已经说过UNIQUE(sku)
。这提供了索引和唯一性约束。
依次添加UNIQUE(sku, x)
:
- 不提供任何额外的唯一性约束,
- 不提供任何额外的索引功能,除了...
- 是否提供可能有用的 "covering" 索引 if
SELECT
中提到的唯一两列是 sku
和 x
。即便如此,您也可以将其设为 INDEX
而不是 UNIQUE
、 因为 ...
- 每个
INSERT
都必须做一些额外的努力来防止"duplicate key"。 (好的,INSERT
代码不够智能,无法看到您有 UNIQUE(sku)
。)
如果那是你的完整 table,没有 很好的理由让 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
。
因此,table 所呈现的 的最佳索引集不是 3 个索引,而是 1:
PRIMARY KEY(sku)
还有一点要注意:使用 InnoDB,PK 在 BTree 中与数据 "clustered"。即按PK查找效率很高。当需要遍历一个"secondary index"时,有两步:先下钻secondary index的BTree找到PK,再下钻PK的BTree
在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
) 已经具有唯一索引?还是不是,这种重复的唯一索引确实有某种原因?
是的,你可以。但这没有意义。但是,让我们分析一下是怎么回事。
INDEX
(UNIQUE
或不是)是一个 BTree,有助于在 table.
一个UNIQUE
索引既是一个索引又是一个"constraint"表示不应有任何重复.
您已经说过UNIQUE(sku)
。这提供了索引和唯一性约束。
依次添加UNIQUE(sku, x)
:
- 不提供任何额外的唯一性约束,
- 不提供任何额外的索引功能,除了...
- 是否提供可能有用的 "covering" 索引 if
SELECT
中提到的唯一两列是sku
和x
。即便如此,您也可以将其设为INDEX
而不是UNIQUE
、 因为 ... - 每个
INSERT
都必须做一些额外的努力来防止"duplicate key"。 (好的,INSERT
代码不够智能,无法看到您有UNIQUE(sku)
。)
如果那是你的完整 table,没有 很好的理由让 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
。
因此,table 所呈现的 的最佳索引集不是 3 个索引,而是 1:
PRIMARY KEY(sku)
还有一点要注意:使用 InnoDB,PK 在 BTree 中与数据 "clustered"。即按PK查找效率很高。当需要遍历一个"secondary index"时,有两步:先下钻secondary index的BTree找到PK,再下钻PK的BTree