一、前言

前面五篇
SQL 第一篇:CRUD 实战,从 user 表开始写接口

SQL 第二篇:表结构设计(为什么企业要拆成 3 张表)

SQL 第三篇:表关系设计(user_id 到底是什么)

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 从来都不是“背语法”

而是:

“用数据库支撑业务系统”

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐