目的:在回表前就进行where多个条件的判断,从而回表到服务器层的数据量足够小
索引下推的工作原理
在没有索引下推优化的情况下,当 MySQL 使用索引进行查询时,它会从索引中获取符合条件的索引条目,然后回表(访问实际数据行)并将结果返回给 MySQL 服务器层进行进一步的过滤。这种情况下,即使某些索引条目不符合查询的所有条件,MySQL 也需要回表读取完整的数据行。
引入索引下推优化后,MySQL 可以在存储引擎层(如 InnoDB)就执行部分查询条件的过滤。这样可以显著减少需要回表的次数,从而提高查询性能。
使用索引下推的示例
假设有一个表 employees,其定义如下:
CREATE TABLE employees (employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT,hire_date DATE,INDEX idx_department_hire_date (department_id, hire_date)
);
我们有一个查询,用于查找特定部门中某个日期之后入职的员工:
SELECT * FROM employees WHERE department_id = 5 AND hire_date > '2020-01-01';
没有索引下推优化
MySQL 使用 idx_department_hire_date 索引查找所有 department_id = 5 的索引条目。
对每个找到的索引条目,MySQL 回表获取实际的数据行。
在 MySQL 服务器层过滤 hire_date > ‘2020-01-01’ 的条件。
启用索引下推优化
MySQL 使用 idx_department_hire_date 索引查找 department_id = 5 的索引条目。
在存储引擎层应用 hire_date > ‘2020-01-01’ 条件,过滤掉不符合条件的索引条目。
只对符合条件的索引条目回表,获取实际的数据行。