MySQL 的覆盖索引是什么?

Sherwin.Wei Lv7

MySQL 的覆盖索引是什么?

回答重点

MySQL 的覆盖索引(Covering Index)是指二级索引中包含了查询所需的所有字段,从而使查询可以仅通过访问二级索引而不需要访问实际的表数据(主键索引)。

扩展知识

覆盖索引的优点

  • 减少I/O操作:因为查询可以直接从索引中获取所有需要的数据,避免了访问实际表的数据页,从而减少了I/O操作。
  • 提高查询速度:索引比表数据更紧凑,因此从索引中读取数据比从表中读取要快。
  • 减少内存占用:只需要读取索引页而不是表数据页,可以减少内存占用。

覆盖索引示例

比如,目前有一张表:

1
2
3
4
5
6
7
8
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
hire_date DATE,
department_id INT,
INDEX idx_name_hiredate (last_name, first_name, hire_date)
);

我们需要获取员工的姓、名和雇佣日期:

1
2
3
SELECT last_name, first_name, hire_date 
FROM employees
WHERE last_name = '鸭' AND first_name = '面试';

对于这个查询,idx_name_hiredate 就是一个覆盖索引,因为它包含了查询所需的所有列 last_name、first_name 和 hire_date,MySQL 可以直接从这个索引中获取结果,而无需访问实际的主键索引的数据。

如果需求变化,要多查找一个 department_id 信息:

1
2
3
SELECT last_name, first_name, hire_date, department_id 
FROM employees
WHERE last_name = '鸭' AND first_name = '面试';

此时就无法利用覆盖索引了,因为 idx_name_hiredate 上并不包含 department_id,所以需要从主键索引中获得数据。

Comments