合理使用索引可提升 mysql 查询效率。1. 为 WHERE 条件字段如 emai l 创建索引,加快过滤速度;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 验证效果。索引不是越多越好,过多会影响写入性能,需权衡取舍。