You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复合主键第二列需单独建索引吗?能否删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:24:17