前置知识:在阅读本文之前,建议先了解 EXPLAIN 命令的基础知识。如果你还不熟悉 EXPLAIN,请先阅读《MySQL EXPLAIN 命令详解:SQL 查询性能分析与优化指南(基础篇)》。
索引是提升数据库查询性能的重要手段,但并不是所有查询都能有效利用索引。在实际开发中,我们经常遇到索引失效的情况,导致查询性能下降。本文将通过 EXPLAIN 命令,逐一验证 6 种常见的索引失效场景,并提供相应的优化建议。
本文将验证以下场景:
- 场景 1:模糊匹配导致索引失效
- 场景 2:函数操作导致索引失效
- 场景 3:表达式计算导致索引失效
- 场景 4:隐式类型转换导致索引失效
- 场景 5:联合索引非最左匹配导致索引失效
- 场景 6:WHERE 子句中的 OR 导致索引失效
一、创建测试表
为了准确验证每个场景,我们采用"按需创建索引"的方式,避免预先创建的索引影响验证结果。
-- 创建员工表(不创建索引,只保留主键)
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
age INT,
phone VARCHAR(20),
salary DECIMAL(10,2),
department_id INT,
hire_date DATE
);
-- 插入测试数据
INSERT INTO employees (name, age, phone, salary, department_id, hire_date)
VALUES('张三',25,'13800138001',8000.00,1,'2020-01-15'),
('李四',30,'13800138002',12000.00,2,'2019-06-20'),
('王五',28,'13800138003',9500.00,1,'2021-03-10'),
('赵六',35,'13800138004',,,),
(,,,,,),
(,,,,,),
(,,,,,),
(,,,,,),
(,,,,,),
(,,,,,);
employees;
INDEX employees;


