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可以直接从索引返回结果,而不需要访问实际表数据。
总结
覆盖索引通过包含查询所需的所有列,显著提高了查询性能,尤其是对大表的查询。为了充分利用覆盖索引,建议在设计索引时,综合考虑查询条件列、选择列和排序列,并在一个索引中包含这些列。