1 什么是覆盖索引?对要查询的列 和 查询条件中的列 有什么要求
覆盖索引(Covering Index)是指一个索引包含了一次查询所需的全部列,因此可以完全满足查询需求,而无需访问实际的表行数据。(即避免回表操作)。
覆盖索引的定义
覆盖索引是一个包含查询中的所有列(包括查询条件列、选择列和排序列)的索引。覆盖索引使得查询可以完全通过索引来执行,而不需要读取表的实际数据行。
覆盖索引的要求
- 查询条件列(WHERE 子句中的列):这些列可以帮助MySQL快速定位匹配的行。
- 选择列(SELECT 子句中的列):这些列是查询返回的列。
- 排序列(ORDER BY 子句中的列):如果查询包括排序,这些列应该包含在索引中,以利用索引进行排序。
举个例子
假设有一个表 students,包含以下字段:
- id(主键)
- name
- age
- grade
假设我们有以下查询:
SELECT name, age FROM students WHERE name LIKE '张%' AND age > 20; 
为了使查询可以使用覆盖索引,我们需要创建一个包含 name 和 age 列的复合索引:
CREATE INDEX idx_name_age ON students (name, age); 
覆盖索引的好处
- 提高查询性能:由于所有查询需要的数据都在索引中,MySQL不需要回表查找,减少了I/O操作。
- 减少数据页访问:访问索引通常比访问数据页更快,特别是在表较大的情况下。
- 优化磁盘使用:使用覆盖索引可以减少磁盘读取操作,提高缓存命中率。
有了覆盖索引 idx_name_age 后,查询过程如下:
- 索引扫描:MySQL使用 idx_name_age索引找到所有name LIKE '张%'的记录。
- 索引下推(ICP):在索引扫描过程中,直接在索引中检查 age > 20的条件。
- 返回结果:由于 name和age都包含在索引中,MySQL可以直接从索引返回结果,而不需要访问实际表数据。
总结
覆盖索引通过包含查询所需的所有列,显著提高了查询性能,尤其是对大表的查询。为了充分利用覆盖索引,建议在设计索引时,综合考虑查询条件列、选择列和排序列,并在一个索引中包含这些列。