数据量大查询慢?索引让你的SQL秒级响应!|转行学DB第9天
大家好呀!我是数据库小学妹👋
前几篇我们学会了各种查询技巧:单表查、多表连、分组统计、子查询嵌套。但随着查询的数据越来越多,我就发现:
同样一条查询,数据少的时候秒出,数据多了居然要等好几秒!有没有办法让查询变快?
当然是有的!今天给大家分享的就是这个可以让查询速度飞起来的神器——“索引”。它就像书的目录,能帮数据库快速找到目标数据,而不是一页页翻。
一、没有索引是什么体验?
想象一下,你拿到一本没有目录、没有拼音索引的《新华字典》。想查“数据库”三个字是什么意思,你只能从第一页开始,一行一行往下看……
这就是全表扫描:数据库把整张表的每一行都翻一遍,直到找到匹配的数据。数据量小的时候无所谓,一旦有几十万、几百万行,就会慢到怀疑人生。
而索引就是给数据建的“目录”或“拼音索引”。有了它,数据库可以像查字典一样,先定位到大概位置,再快速找到目标。
💡 索引的本质是一种数据结构(MySQL里通常是B+树),它能帮助数据库跳过大量无关数据,直接定位到目标行。
二、索引长什么样?
假设有一张用户表users,没有索引时想查name = '小明',数据库会一行一行对比。
| id | name | age | city |
|---|---|---|---|
| 1 | 张三 | 20 | 北京 |
| 2 | 李四 | 21 | 上海 |
| 3 | 小明 | 22 | 深圳 |
| … | … | … | … |
给name列加上索引后,数据库会维护一个按字母排序的目录:
| name | 所在位置(行号/地址) |
|---|---|
| 李四 | 2 |
| 小明 | 3 |
| 张三 | 1 |
现在查name = '小明',数据库先去目录里找到“小明”,然后直接跳到第3行,不需要翻其他行。
这就是索引加速的原理。
三、怎么创建和使用索引?
1. 创建索引
CREATE INDEX idx_name ON users (name);idx_name是索引的名字(随便起,但最好有意义)users是表名(name)是对哪一列建索引
2. 查看表的索引
SHOW INDEX FROM users;3. 删除索引
DROP INDEX idx_name ON users;4. 创建唯一索引(值不能重复)
CREATE UNIQUE INDEX idx_phone ON users (phone);四、什么时候该用索引?什么时候不该用?
💡 索引不是越多越好。每建一个索引,插入、更新、删除数据时都会多花时间维护索引。读写平衡很重要。
五、最左前缀原则:联合索引的小秘密
如果你经常同时用name和age作为条件:
SELECT * FROM users WHERE name = '小明' AND age = 22;可以建联合索引:
CREATE INDEX idx_name_age ON users (name, age);这里需要注意:联合索引遵循最左前缀原则。意思是,查询条件必须从索引的最左边列开始才能用到索引。
- ✅
WHERE name = '小明'→ 用到索引 - ✅
WHERE name = '小明' AND age = 22→ 用到索引 - ❌
WHERE age = 22→ 用不到索引(因为没有从最左列name开始)
所以建联合索引时,要把最常用的筛选列放在最左边。
六、新手避坑指南(血泪总结)
七、今日学习心得
今天的内容总结成三句话:
- 索引就是书的目录,帮数据库快速定位数据,避免全表扫描
- 不是越多越好,适合经常作为
WHERE、JOIN、ORDER BY的列 - 联合索引注意最左前缀,从最常用的列开始
以前不知道索引的时候,觉得“查询慢就慢呗,等等就好了”。现在学会用EXPLAIN查看执行计划,看到type列从ALL(全表扫描)变成ref(使用索引),那种成就感,就像给自行车装上了发动机。
👋 我是数据库小学妹,一个从设计转行数据库的菜鸟。 我们一起,把复杂的技术变得简单有趣!💕
本文为个人学习总结,所有命令均在MySQL 8.0环境下验证。索引是把双刃剑,合理使用才能让查询飞起来。
