复合主键第二列需单独建索引吗?能否删除product_id索引?
表结构与场景说明
CREATE TABLE `products` ( `account_id` varchar(100) NOT NULL, `product_id` int NOT NULL, `product_name` varchar(100) NOT NULL, PRIMARY KEY (`account_id`,`product_id`), KEY `idx_product_id` (`product_id`) )
这是多租户电商场景,每个账户拥有专属产品,仅product_id无业务意义,必须关联account_id使用,因此设置(account_id, product_id)为复合主键。已知无需单独为account_id建索引,因复合主键已生成联合索引。由于产品查询始终在账户上下文进行,针对以下问题解答:
1. 能否删除KEY idx_product_id (product_id)?
完全可以删除。
你的业务逻辑明确所有产品查询都会带上account_id,复合主键生成的联合索引(account_id, product_id)已经能覆盖所有有效查询场景:
- 按
account_id + product_id查询时,直接命中主键索引,效率最高; - 按
account_id查询该账户下所有产品时,联合索引可以快速定位到该账户对应的所有条目,顺序扫描即可满足需求。
单独的product_id索引在这个场景下没有任何实用价值——你已经说明单查product_id无意义,留着它只会在插入、更新、删除产品时额外消耗资源维护索引,删掉是最优选择。
2. 通常情况下,复合主键的第二列是否需要单独建索引?
没有固定答案,完全取决于业务查询需求:
- 如果业务中存在不带复合主键第一列,仅按第二列查询的场景,那单独建索引是必要的,否则这类查询会走全表扫描,性能极差;
- 如果所有查询都必须带上复合主键的第一列,或者单查第二列没有业务价值,那单独建索引纯粹是浪费存储空间和写操作性能,完全没必要。
回到你的场景,既然明确产品查询始终在账户上下文进行,单查product_id无意义,那这个单独索引就不需要存在。
内容的提问来源于stack exchange,提问作者user19483562
相关产品推荐
相关产品推荐

