MySQL 系统学习 第四阶段:MySQL 高级 第一节:索引(Index)

一、为什么需要索引?

先看一个问题。

假设用户表:

复制代码
复制代码
CREATE TABLE user(
    id BIGINT,
    username VARCHAR(50),
    age INT
);

数据:

复制代码
复制代码
id    username    age

1     Tom         20
2     Jack        25
3     Lucy        18
...
10000000  Mike    30

现在执行:

复制代码
复制代码
SELECT *
FROM user
WHERE username='Tom';

没有索引时

MySQL 怎么查?

只能:

复制代码
复制代码
第一条
 ↓
第二条
 ↓
第三条
 ↓
...
 ↓
1000万条

这种方式叫:

全表扫描(Full Table Scan)

时间复杂度:

复制代码
复制代码
O(n)

数据越多:

越慢。


有索引时

例如:

给 username 创建索引:

复制代码
复制代码
CREATE INDEX idx_username
ON user(username);

MySQL 会建立类似:

复制代码
复制代码
索引结构

Tom
 |
位置
 |
数据行

查询:

复制代码
复制代码
WHERE username='Tom'

可以快速定位。

时间复杂度:

复制代码
复制代码
O(log n)

二、什么是索引?

定义:

索引是数据库为了提高查询效率而创建的一种数据结构。

简单理解:

索引 = 数据目录。


现实例子:

没有目录的书:

复制代码
复制代码
找 MySQL章节

翻第一页
翻第二页
...
翻500页

有目录:

复制代码
复制代码
目录

MySQL
  ↓
第300页

快速定位。

数据库索引也是类似思想。


三、MySQL 常见索引类型

1. 普通索引(普通查询)

语法:

复制代码
复制代码
CREATE INDEX idx_name
ON user(name);

作用:

提高查询速度。


2. 唯一索引

保证数据唯一。

例如:

手机号:

复制代码
复制代码
CREATE UNIQUE INDEX idx_phone
ON user(phone);

保证:

复制代码
复制代码
13800000001

不能重复。


3. 主键索引

创建主键:

复制代码
复制代码
PRIMARY KEY(id)

MySQL 自动创建索引。

例如:

复制代码
复制代码
id BIGINT PRIMARY KEY

4. 联合索引 ⭐⭐⭐⭐⭐

多个字段组成索引。

例如:

复制代码
复制代码
CREATE INDEX idx_name_age
ON user(name, age);

表示:

同时根据:

复制代码
复制代码
name + age

建立索引。


四、索引的数据结构

MySQL 常用:

B+Tree

这是重点。

为什么不用:

  • 数组?
  • 链表?
  • 二叉树?

而选择:

B+Tree?


1. 数组

查询:

快:

复制代码
复制代码
O(1)

但是:

插入删除慢。


2. 链表

查询:

慢:

复制代码
复制代码
O(n)

3. 二叉树

如果数据:

复制代码
复制代码
1
 \
  2
   \
    3
     \
      4

会退化成链表。


4. B+Tree

结构:

复制代码
复制代码
              50
          /        \
       20            80
     /   \          /   \
   10    30       60    90

数据存储在叶子节点

特点:

  • 高度低
  • 查询快
  • 适合磁盘
  • 范围查询优秀

所以 MySQL InnoDB 使用 B+Tree。


五、索引创建和删除

创建

复制代码
复制代码
CREATE INDEX idx_user_name
ON user(username);

查看索引

复制代码
复制代码
SHOW INDEX FROM user;

删除索引

复制代码
复制代码
DROP INDEX idx_user_name
ON user;

六、什么时候应该创建索引?

适合:

1. 经常查询字段

例如:

复制代码
复制代码
WHERE username='Tom'

2. 经常排序

例如:

复制代码
复制代码
ORDER BY create_time DESC

3. 经常关联

例如:

复制代码
复制代码
JOIN user
ON order.user_id=user.id

4. 外键字段

例如:

复制代码
复制代码
order.user_id

七、索引是不是越多越好?

不是。

这是面试高频问题。

原因:


① 占用空间

索引也是数据。

例如:

复制代码
复制代码
10GB数据

+
多个索引

可能增加几GB

② 降低写入速度

INSERT:

原来:

复制代码
复制代码
写数据

有索引:

复制代码
复制代码
写数据
+
更新索引

UPDATE:

修改字段:

可能需要更新索引。


DELETE:

删除数据:

同时删除索引记录。


所以:

索引提高查询速度,但是降低写入性能。


八、本节总结

内容 说明
索引 提高查询速度的数据结构
无索引 全表扫描
有索引 快速定位
MySQL索引结构 B+Tree
主键 自动创建索引
唯一索引 保证唯一
联合索引 多字段索引
索引缺点 占空间、降低写性能

🎯 本节核心一句话:

索引就是数据库的数据目录,通过空间换时间,让查询从扫描大量数据变成快速定位数据。

相关推荐
l1258655 分钟前
# RAG低延迟架构设计:从5秒到500ms的优化全链路
数据库·人工智能·python·langchain
RisunJan8 分钟前
Linux命令-vgdisplay(显示卷组详细属性)
linux·运维·数据库
爱和冰阔落37 分钟前
【MySQL 慢查询排查实战】列表接口逐渐变慢时,怎样从请求链路定位原因
android·数据库·mysql
JacksonMx42 分钟前
企业级 JPA 与数据库架构落地指南
数据库·数据库架构
Dxy123931021643 分钟前
MySQL有哪些锁?InnoDB锁体系完整梳理博客
数据库·mysql
老当益壮梁奶奶1 小时前
Linux软件编程学习笔记(二)Linux文件IO编程入门:从fopen到fgetc
linux·c语言·c++·笔记·学习
sunoo-2291 小时前
C 语言文件 IO 全攻略:从基础函数到实战踩坑(BMP 读取 + 词典查询)
linux·c语言·前端·笔记·vscode·学习
wear工程师1 小时前
MySQL 索引条件下推是什么?Using index condition 并不是覆盖索引
sql·mysql
蒸蒸yyyyzwd1 小时前
cpp选手秋招学习笔记 day12
笔记·学习·oracle
Wang's Blog1 小时前
PostgreSQL笔记38:慢查询定位与优化的系统方法论
数据库·笔记·postgresql