如何在mysql中使用索引加速WHERE查询

来源:这里教程网 时间:2026-02-28 20:30:10 作者:

在 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 验证效果。索引不是越多越好,过多会影响写入性能,需权衡取舍。

相关推荐