news 2026/5/10 2:07:00

SQL 第六篇:索引入门(为什么你的查询越来越慢)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL 第六篇:索引入门(为什么你的查询越来越慢)

一、前言

前面五篇,我们已经完成了:

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

而是:

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 2:03:42

ARM与Thumb指令集架构解析及优化实践

1. ARM与Thumb指令集架构解析在嵌入式系统开发领域,ARM处理器因其高效的功耗比和灵活的指令集架构而占据主导地位。ARM架构最显著的特点之一就是支持两种指令集状态:32位的ARM指令集和16位的Thumb指令集。这种双指令集设计在保持性能的同时,显…

作者头像 李华
网站建设 2026/5/10 1:58:32

基于多模态大模型的电影智能问答系统:从原理到实践

1. 项目概述:当电影遇上AI,我们能聊些什么?最近在GitHub上看到一个挺有意思的项目,叫“MovieChat”。光看名字,你大概能猜到,这玩意儿跟电影和聊天有关。没错,它本质上是一个能让你和电影“对话…

作者头像 李华
网站建设 2026/5/10 1:56:28

Java——继承的细节

继承的细节1、构造方法1.1、父类无默认构造1.2、父类构造调用可被重载的方法2、重名与静态绑定2.1、重名3、重载和重写4、父子类型转换5、继承访问权限protected6、可见性重写7、防止继承final1、构造方法 1.1、父类无默认构造 子类可以通过super调用父类的构造方法&#xff…

作者头像 李华
网站建设 2026/5/10 1:52:57

基于MCP协议构建AI智能体工具服务器:原理、安全与实践

1. 项目概述:一个为AI智能体赋能的MCP服务器最近在折腾AI智能体(Agent)的开发,发现一个挺有意思的痛点:如何让这些智能体稳定、安全地访问外部工具和资源?比如,你想让一个智能体帮你分析GitHub仓…

作者头像 李华
网站建设 2026/5/10 1:51:31

传统PM转型AI产品经理:我踩过的3个坑

本文是一位传统产品经理转型AI产品经理的心路历程。作者从对AI一无所知,到通过实践学习如何与AI协作,总结出三条转型路径:从“用”AI提效开始建立感知;完整主导一个AI功能从0到1;有选择地补充AI基础知识。转型关键在于…

作者头像 李华