大数跨境
0
0

【性能优化必备】什么是覆盖索引?为什么它查询快?

【性能优化必备】什么是覆盖索引?为什么它查询快? Linux运维技术之路
2025-10-20
1
导读:【性能优化必备】什么是覆盖索引?为什么它查询快?👉 “什么是覆盖索引?为什么它比普通索引快?

 










 

【性能优化必备】什么是覆盖索引?为什么它查询快?

👉 “什么是覆盖索引?为什么它比普通索引快?”

很多人一脸迷茫:

“是不是说索引把数据都覆盖了?”

其实,覆盖索引是 MySQL 提升查询效率的一大利器,今天我们来彻底讲清楚!


一、什么是覆盖索引?

📌 定义
如果一个查询所需的字段 都能从索引中获取,不需要回表,就叫做 覆盖索引(Covering Index)

👉 通俗理解:

  • • 普通索引查询:查到主键,还得去表里“翻书”取数据(回表)。
  • • 覆盖索引查询:索引里已经有你要的字段,直接返回,一步到位

二、覆盖索引的例子

假设有一个用户表:


   
    
   CREATE TABLE user (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT,
  email VARCHAR(100),
  INDEX idx_name_age (name, age)
);

普通查询(需要回表)


   
    
   SELECT * FROM user WHERE name='Tom';
  • • idx_name_age 索引能定位到主键 id
  • • 但 * 要返回所有字段,还需要回表。

覆盖索引查询(不用回表)


   
    
   SELECT name, age FROM user WHERE name='Tom';
  • • 查询的字段 刚好在 idx_name_age 索引里
  • • 不用再去主键索引找整行数据,直接返回。
  • • 效率更高

三、覆盖索引的优势

  1. 1. 避免回表,减少 IO
    • • 索引树比数据表小,扫描更快。
  2. 2. 提升查询效率
    • • 直接从索引返回结果,减少磁盘读取。
  3. 3. 减少锁竞争
    • • InnoDB 二级索引覆盖查询时,不用访问主键页,减少锁冲突。

四、使用覆盖索引的注意事项

  1. 1. SELECT 的字段要包含在索引里
    • • 只要有一个字段不在索引中,就需要回表。
  2. 2. 尽量用联合索引
    • • 常见查询字段可以建组合索引,提高覆盖率。
  3. 3. **避免 SELECT ***
    • • SELECT * 会破坏覆盖索引优化,因为它要全字段。

五、实战技巧

  • • ✅ 写 SQL 时,多用 精确字段查询(比如 SELECT name, age),
    避免 SELECT *,更容易触发覆盖索引优化。
  • • ✅ 建立合理的 联合索引,让常用查询直接命中覆盖索引。
  • • ✅ 使用 EXPLAIN 查看执行计划,如果 Extra 列有 Using index,说明用了覆盖索引。

👉 示例:


   
    
   EXPLAIN SELECT name, age FROM user WHERE name='Tom';

输出:


   
    
   Extra: Using index

这就是覆盖索引!


六、总结一句话

  • • 覆盖索引 = 查询字段完全包含在索引里
  • • 好处:避免回表、减少 IO、查询更快
  • • 口诀
    👉 字段都在索引里 → 一步到位,不用回表

🎯 面试必备回答:

覆盖索引指的是查询的字段都能从索引中获取,而不需要回表。
它能减少磁盘 IO,提高查询效率,常见于联合索引场景。
使用时要注意 SELECT 精确字段,而不是 SELECT *。

 




 

 


往期回顾


【声明】内容源于网络
0
0
Linux运维技术之路
专注运维架构、高可用、高并发、高性能、大数据、容器化、数据库、python、devops等开源技术和实践的分享。
内容 347
粉丝 0
Linux运维技术之路 专注运维架构、高可用、高并发、高性能、大数据、容器化、数据库、python、devops等开源技术和实践的分享。
总阅读694
粉丝0
内容347