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
主键 自动创建索引
唯一索引 保证唯一
联合索引 多字段索引
索引缺点 占空间、降低写性能

🎯 本节核心一句话:

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

相关推荐
宠友信息2 小时前
多端即时通讯源码技术实践,Redis路由、MySQL持久化与Socket接入
spring boot·websocket·mysql·uni-app
山峰哥2 小时前
数据库工程与SQL优化实战指南‌
数据库·sql·oracle·深度优先·宽度优先
Quincy_Freak3 小时前
Python 轻量化数据存储实践:国产化环境下SQLite高效管理方案
数据库·sqlite·数据库管理·大数据分析·sqlitego
星子yu3 小时前
【学习】怎么学好数据结构
数据结构·学习
~kiss~3 小时前
MoE的痛点:离散路由
学习
Amazing_Cacao3 小时前
CFCA精品可可工艺师初级校准:暴力破解机器黑盒,实现物理参数与最终风味的精准对齐
笔记·学习
SelectDB技术团队4 小时前
Agent 场景动态 JSON 性能拆解:Apache Doris 比 ClickHouse 快 7 倍、比 Elasticsearch 快 2 倍
数据库·clickhouse·elasticsearch·json·apache·日志分析·apache doris
greasyfork4 小时前
多种数据库管理混乱?Navicat Premium 17 for Mac 统一解决
数据库·mysql·macos·mac
Dream_fly_iboy4 小时前
系统架构设计师之数据库
数据库