给表编一份目录
没有索引,MySQL 找数据只能从头翻到尾;有了索引,就像查字典先看目录,几步就找到了。
今天弄懂:索引为什么快?它有什么代价?怎么建、怎么看、怎么删?
→ / 空格 / 翻页笔:下一步 ←:上一步 + -:字号 F:全屏
📖 一页一页翻没有索引0 页
🔖 先查目录有索引0 步
第 1 层→第 2 层→第 3 层→✓ 第 87 页
要找的内容在第 87 页
🧭 先想一想 点击卡片翻面
1
为什么需要索引
一行一行找 vs 按目录找
🧑💻
📍 场景 · 教务系统"学校有 2 万名学生。按姓名查一个学生,页面要转好几秒。"
表里的姓名是乱序的,MySQL 只能从第 1 行开始,一行一行比,2 万行都要看一遍。
给姓名建一个索引:另外存一份“按姓名排好序的目录”,查的时候先查目录,三四步就找到了。
索引就是表的目录:把某一列的值排好序,记下每个值在哪一行。它多占一点空间,换来查得更快。
2
索引长什么样,怎么用它查
以选课表 sc 的成绩 score 为例
建索引:把成绩取出来、排好序,分成几组放进叶子;上面再放一个根,记住每组从几分开始。查找时从根 → 叶子,几步就到。
📌 记住
- 索引 = 排好序的值 + 这一行在哪里
- 查找从根走到叶子,每层只看一个节点
- 这种结构叫 B+ 树,MySQL 默认就用它
3
索引不是越多越好
索引的代价与设置原则
索引让查询变快,但每次插入、修改、删除数据,每个索引都要跟着改,还要多占空间。
这一列该不该建索引?先自己判断,再点按钮
📋 设置原则
| 原则 | 为什么 |
|---|---|
| ① 索引不要建太多,用不到的及时删掉 | 每个索引都要随着增删改一起维护 |
| ② 重复值很多的列(如性别)不建 | 只有两种值,用索引也筛不掉多少行 |
| ③ 经常用来查询、排序、分组、连接的列,适合建 | 排好序的目录,正好派上用场 |
| ④ 视图上不能建索引 | 视图里没有数据,查视图时用的是基本表的索引 |
4
索引的类型
重点掌握:普通索引、唯一索引、主键索引
最常用的是三种:普通索引(值可以重复)、唯一索引(值不能重复)、主键索引(定义主键时自动建)。点左边的索引看它的类型。
普通 · 唯一 · 主键
| 值能重复吗 | 一张表能有几个 | |
|---|---|---|
| 普通索引 | 能 | 多个 |
| 唯一索引 | 不能 | 多个 |
| 主键索引 | 不能,也不能为空 | 1 个 |
📖 了解一下
- 索引建在 1 个字段上叫单列索引,建在几个字段上叫复合索引
- 定义主键和外键时,MySQL 会自动建索引
- 教材里还有全文索引、Hash 索引、聚集索引等,了解名字即可
5
创建索引:三种写法
CREATE INDEX、建表时创建、ALTER TABLE 添加
最常用:CREATE INDEX 索引名 ON 表名 (字段名); 加上 UNIQUE 就是唯一索引。
三种写法右边是建好后用 SHOW INDEX 看到的结果
6
查看与删除索引
SHOW INDEX;DROP INDEX
查看:SHOW INDEX FROM 表名; 删除:DROP INDEX 索引名 ON 表名; 或 ALTER TABLE 表名 DROP INDEX 索引名;
删除索引两种写法效果一样
📌 记住
- SHOW INDEX 里,索引的每个字段占一行
- Non_unique:0 是唯一索引,1 是普通索引
- 删除索引不会删掉表里的数据
✓
课堂小测
点击选项,立即看对错;答错了可以再选
一页总结
保山学院 · 人工智能教研室 · 曹鼎鼎 | 数据库原理与应用 · 第 7 章 视图和索引