MySQL 8.0.29:优化LEFT JOIN查询的高效索引咨询
优化该MySQL查询的索引建议
针对你的查询场景,单独的tag_id索引无法最大化性能,推荐创建以下两个联合索引:
1. 为activity表创建覆盖联合索引
CREATE INDEX idx_activity_status_tag_id ON activity (status, tag_id, id);
这个索引的作用:
- 优先通过
status = :status过滤数据,快速缩小查询范围 - 索引内置
tag_id,直接用于和inventory的JOIN关联,无需回表读取原表数据 - 同时包含查询需要的
id字段,实现覆盖索引,彻底避免回表操作
2. 为inventory表创建覆盖联合索引
CREATE INDEX idx_inventory_tag_id_id ON inventory (tag_id, id);
这个索引的作用:
- 通过
tag_id快速匹配activity表的关联数据 - 索引内置
id字段,查询所需的inv.id可直接从索引获取,无需回表
额外验证步骤
- 执行
EXPLAIN查看查询执行计划,确认:activity表的type列是否为ref或range,key列是否显示上述索引inventory表的关联是否命中对应的联合索引
- 若表数据量较大,更新表统计信息帮助优化器生成最优计划:
ANALYZE TABLE activity; ANALYZE TABLE inventory;
内容的提问来源于stack exchange,提问作者arya asda
相关产品推荐
相关产品推荐

