多对多关系联结表索引配置咨询:PK联合索引外是否需额外建外键索引
多对多联结表索引问题解答
针对你的场景的直接结论
- 不需要单独创建
product_id的索引:你现有的主键联合索引(product_id, order_id)符合B树索引的最左前缀匹配原则,单独按product_id查询的场景完全可以复用这个主键索引,额外创建属于冗余操作,只会占用额外存储空间,没有任何收益。 - 需要单独创建
order_id的索引:order_id是联合主键的第二列,无法通过现有主键索引满足单独按order_id过滤的查询需求(比如查询某笔订单下关联的所有商品),如果不建这个索引,这类查询会触发全表扫描,性能会很差。
通用多对多联结表索引配置规则
- 优先创建双外键联合主键:两个外键的顺序根据业务高频查询方向决定,更常用作查询条件的外键放左侧,靠最左前缀原则优先覆盖高频方向的单条件查询。
- 为联合主键右侧的外键单独创建单值索引:覆盖另一方向的单条件外键查询需求,保证两个关联表的反向查询都能走索引。
- 按需添加扩展索引:如果联结表有额外业务字段(比如购买数量、关联时间、状态等),且存在带这些字段的过滤、排序、分组查询,可以针对性创建带这些字段的联合索引,比如
(product_id, purchase_count)或者(order_id, create_time)这类。 - 读多写少场景可以适当放宽索引数量限制:你当前的场景几乎只有读操作,不需要额外考虑索引带来的写入性能损耗,只要是能覆盖查询场景的索引都可以创建,优先保证读性能。
内容的提问来源于stack exchange,提问作者George Lvov
相关产品推荐
相关产品推荐

