在数据库应用中,查询变慢最常见的原因就是该加索引的地方没有加。索引就像书的目录,能让数据库直接跳到目标数据所在位置,而不是一页页翻。下面用一个最小化的例子,看看SQL优化里使用索引到底是怎么起作用的。

准备一张测试表
我们创建一张用户表,里面有用户编号、姓名和年龄。先不建任何索引,插入一些数据用来观察查询行为。
-- 创建用户表,无索引
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);
-- 插入示例数据
INSERT INTO user_info (name, age) VALUES ('张三', 20);
INSERT INTO user_info (name, age) VALUES ('李四', 25);
INSERT INTO user_info (name, age) VALUES ('王五', 30);
-- 实际测试中可插入更多行
没有索引时的查询
当我们根据姓名查找用户时,由于name列上没有被索引,数据库只能做全表扫描,也就是逐行比对。
-- 未建索引的查询 SELECT * FROM user_info WHERE name = '李四';
如果数据量达到几万或上百万行,这种全表扫描会明显拖慢响应速度。
为列建立索引
对频繁出现在WHERE条件里的列,可以建一个普通索引。下面是给name列加索引的语句。
-- 为name列创建索引 CREATE INDEX idx_name ON user_info (name);
使用索引后的查询
同样还是按姓名查,数据库现在会先查索引,再回表取数据,避免了全表扫描。
-- 建索引后的同一查询 SELECT * FROM user_info WHERE name = '李四';
怎么确认索引生效了
在MySQL里,可以用EXPLAIN查看执行计划,重点看key字段是否显示了我们建的索引名。
-- 查看执行计划 EXPLAIN SELECT * FROM user_info WHERE name = '李四';
| 对比项 | 无索引 | 有索引 |
|---|---|---|
| 扫描方式 | 全表扫描 | 索引查找 |
| 数据量大时性能 | 明显下降 | 相对稳定 |
| EXPLAIN的key | NULL | idx_name |
小结
这个小例子说明了SQL优化中使用索引的最基础思路:找出常用查询条件,给对应列建索引,再用执行计划验证。实际业务中还要考虑联合索引、索引选择性等问题,但先理解这一步,就能解决不少慢查询。