合理使用索引可提升MySQL查询效率。1. 为WHERE条件字段如email创建索引,加快过滤速度;2. 多条件查询时使用复合索引(如status, created_at),遵循最左前缀原则;3. 避免对字段使用函数、隐式转换、LIKE '%abc'及OR导致索引失效;4. 用EXPLAIN分析执行计划,确认type为ref/range/const、key显示索引名、Extra出现Using index表示索引命中。需根据查询模式设计索引,避免过多索引影响写入性能。

在 MySQL 中,合理使用索引可以显著提升 WHERE 查询的执行效率。索引的本质是为数据建立快速查找结构(如 B+ 树),避免全表扫描,从而减少磁盘 I/O 和查询时间。
1. 为 WHERE 条件字段创建索引
如果查询中经常通过某个字段过滤数据,应为该字段创建索引。
例如:假设有一个用户表:
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(100),
status TINYINT,
created_at DATETIME
);若常执行如下查询:
SELECT * FROM users WHERE email = 'user@example.com';
应在 email 字段上创建索引:
CREATE INDEX idx_email ON users(email);
2. 使用复合索引优化多条件查询
当 WHERE 中包含多个字段时,可创建复合索引(联合索引)。
例如:SELECT * FROM users WHERE status = 1 AND created_at > '2024-01-01';
建议创建复合索引:
CREATE INDEX idx_status_created ON users(status, created_at);
注意: 复合索引遵循最左前缀原则。查询必须包含索引最左边的字段才能有效利用索引。比如上面的索引,只查 created_at 就不会生效。
3. 避免索引失效的常见情况
即使有索引,某些写法会导致 MySQL 无法使用它。
-
对字段使用函数或表达式: 如
WHERE YEAR(created_at) = 2024,应改为WHERE created_at >= '2024-01-01' AND created_at -
隐式类型转换: 比如字符串字段用数字比较:
WHERE email = 123,可能导致索引失效 -
使用 LIKE 以通配符开头:
LIKE '%abc'无法使用索引,而LIKE 'abc%'可以 - OR 条件未全部索引: 若 OR 的字段没有都建索引,可能走全表扫描
4. 利用执行计划分析索引使用情况
使用 EXPLAIN 查看查询是否命中索引。
EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
关注输出中的:
-
type: 值为
ref、range或const表示用了索引;ALL表示全表扫描 - key: 显示实际使用的索引名称
-
Extra: 出现
Using where; Using index表示索引覆盖,性能更优
基本上就这些。关键是根据查询模式设计索引,并持续用 EXPLAIN 验证效果。索引不是越多越好,过多会影响写入性能,需权衡取舍。










