SQL 第六篇:索引入门(为什么你的查询越来越慢)
一、前言
前面五篇
SQL 第一篇:CRUD 实战,从 user 表开始写接口
SQL 第四篇:JOIN 实战(数据库到底是怎么“拼表”的)
SQL 第五篇:SQL 如何真正接入 Spring Boot 项目(企业 Mapper 分层实战)
,我们已经学会了:
,我们已经完成了:
CRUD
建表
表关系
JOIN
项目分层
到这里,其实你已经能做一个基础后端项目了。
但新的问题开始出现:
数据越来越多了
最开始:
user 表
10条数据
查询很快。
后来:
10万条
100万条
1000万条
突然:
查询越来越慢
这时候就进入数据库非常核心的一块:
❗ 索引(Index)
二、什么是索引?
先别急着背定义。
直接举例。
没有索引
你现在有一本书:
1000页
你想找:
“Redis”
如果没有目录。
你只能:
一页一页翻
这就是:
全表扫描
三、索引本质是什么?
索引本质上就是:
❗ 数据的“目录”
有了目录后:
Redis → 第520页
你就不用从第一页开始翻。
数据库也是一样。
四、数据库没有索引会怎么样?
例如:
SELECT *
FROM user
WHERE username = 'zhangsan';
如果:
username 没有索引
数据库只能:
从第一条开始一个个比较
这就是:
全表扫描
数据越多越慢。
五、加索引后会发生什么?
例如:
CREATE INDEX idx_username
ON user(username);
之后:
SELECT *
FROM user
WHERE username = 'zhangsan';
数据库就会:
先查索引
再定位数据
速度会快很多。
六、企业里最常见的索引字段
1️⃣ 主键 id
PRIMARY KEY(id)
主键默认自带索引。
因为:
主键查询非常频繁
2️⃣ username(唯一索引)
username VARCHAR(64) UNIQUE
其实:
UNIQUE 本身也会创建索引
因为登录经常这样查:
SELECT *
FROM user
WHERE username = 'zhangsan';
3️⃣ user_id(普通索引)
例如:
INDEX idx_user_id(user_id)
因为后面 JOIN 经常会:
SELECT *
FROM user_address
WHERE user_id = 1;
所以:
user_id 是高频查询字段
七、为什么 user_id 特别重要?
回忆一下之前的 JOIN:
LEFT JOIN user_address a
ON u.id = a.user_id
这里:
a.user_id
会被频繁使用。
如果没有索引:
每次 JOIN 都会全表扫描
数据一大就会非常慢。
所以企业里:
关联字段基本都会加索引
八、索引是不是越多越好?
很多初学者会这样想:
既然索引能加速
那我全部加索引不就行了?
其实不是。
九、索引的代价
索引本质也是数据结构。
所以:
索引越多
维护成本越高
INSERT 会变慢
例如:
INSERT INTO user ...
数据库不仅要写数据:
还要维护索引
UPDATE 会变慢
例如:
UPDATE user
SET username = 'lisi'
数据库还得更新索引。
十、企业里的索引原则(够用了)
你现在记住这几条就够。
1️⃣ WHERE 用到的字段
例如:
WHERE user_id = 1
可以加索引。
2️⃣ JOIN 用到的字段
例如:
ON u.id = a.user_id
可以加索引。
3️⃣ ORDER BY 用到的字段
例如:
ORDER BY create_time DESC
高频排序时可以考虑索引。
4️⃣ 不要乱加索引
例如:
gender
is_default
这种字段区分度很低。
通常意义不大。
十一、什么是 EXPLAIN?
企业里优化 SQL 时,经常会:
EXPLAIN SELECT ...
它的作用:
查看 SQL 怎么执行
比如:
- 有没有走索引
- 有没有全表扫描
- JOIN 怎么执行
示例
EXPLAIN
SELECT *
FROM user
WHERE username = 'zhangsan';
十二、什么是 B+树?(先建立感觉)
很多人一听:
B树
B+树
就懵。
你现在先不用深挖。
先记一句:
❗ MySQL 的索引底层,大部分是 B+树
它本质上是:
一种特别适合数据库查找的数据结构
后面你再深入。
现在先知道:
索引 = 更快找到数据
就够了。
十三、这一篇真正的核心
这一篇最重要的不是:
CREATE INDEX
EXPLAIN
而是:
❗ 你开始真正理解:
“为什么数据库会变慢”
十四、这一套 SQL 学习真正完成了什么?
到这里,你已经完成了:
CRUD
会写接口
表结构
会建表
表关系
会拆表
JOIN
会查业务数据
Mapper 分层
会接入 Spring Boot
索引
会做基础优化
十五、一句话总结
索引本质上不是“加速器”
而是:
👉 帮数据库更快找到数据的目录结构
十六、最终总结(整个 SQL 系列)
这一套 SQL 学习路线真正的核心是:
CRUD
→ 建表
→ 拆表
→ JOIN
→ 项目落地
→ 性能优化
你会发现:
❗ SQL 从来都不是“背语法”
而是:
“用数据库支撑业务系统”
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)