能,覆盖索引(Covering Index)可以显著减少扫描次数,也常能减少回表次数。
下面从原理和实际效果来解释。
覆盖索引是指:
一条 SQL 所需的所有字段,都包含在某个索引中,不需要再回表查询聚簇索引(如 InnoDB 的主键索引)。
例如:
CREATE INDEX idx_a_b ON t(a, b);
查询:
SELECT a, b FROM t WHERE a = 1;
✅ a、b 都在索引里 → 索引覆盖查询
在 InnoDB 中:
普通二级索引
覆盖索引
✅ 减少一次聚簇索引扫描
覆盖索引通常带来的是:
但不是:
MySQL 优化器在以下情况下会优先选择覆盖索引:
SELECT * FROM orders WHERE user_id = 10;
INDEX(user_id)
→ 扫描 user_id 索引
→ 回表查询完整行
扫描次数 ≈ 2 次 / 行
SELECT user_id, status FROM orders WHERE user_id = 10;
INDEX(user_id, status)
→ 扫描索引
→ 不需要回表
扫描次数 ≈ 1 次 / 行
| 场景 | 是否有明显效果 |
|---|---|
| 大表、高并发 | ✅ 非常明显 |
| 磁盘 IO 瓶颈 | ✅ 明显 |
| 小表或全内存 | ⚠️ 改善有限 |
| 只查主键 | ✅ 天然覆盖 |
SELECT * 都能覆盖SELECT * 一般 无法覆盖覆盖索引通过避免回表,减少聚簇索引扫描次数和随机 IO,从而显著降低整体扫描成本。
如果你愿意,可以把你的 表结构 + SQL + 执行计划 发出来,我可以帮你判断是否已经用到覆盖索引。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。