【MySQL回顾】索引篇
索引简介
什么是索引
索引是一种用于快速查询和检索数据的数据结构。
常见的索引结构有:
- B+树
- Hash
索引就相当于是我们所使用字典的目录,我们可以通过目录轻松找到想要查找的字词的位置。
索引的优缺点
优点:
可以通过减少检索的数据量来大大加快检索速度
可以通过创建唯一性索引保证数据库中每一行数据的唯一性
缺点:
创建索引和维护索引需要耗费许多时间
占用物理内存
B+树索引和Hash索引
B树、B+树扫盲
B树
基本原理:
二叉查找树的升级版,改二叉为多叉,每个节点存储更多的指针信息,以降低I/O操作数(解决了当数据量十分庞大时平衡二叉树深度过深的问题)
在搜索B树时,很明显,访问节点(即读取磁盘)的次数与树的高度呈正比
B+树
- B+树是B树的一种变形,它更适合实际应用中操作系统的文件索引和数据库索引
- B+树的叶子节点有一条引用链指向与它相邻的叶子节点
B树和B+树的比较:
B树 B+树 子树的个数总比关键字个数多1个 关键字的个数与其子树的个数相同 所有节点既存放 键(key) 也存放 数据(data) 只有叶子节点存放 key 和 data,其他内节点相当于索引 可能未到达叶子节点检索就结束了 检索效率稳定,任何查找都是从根节点到叶子节点的过程
哈希索引和B+树索引的比较
哈希索引 | B+树索引 |
---|---|
哈希索引对单个数据定位较快 | 哈希索引对单个数据定位较慢 |
不支持顺序查询 | 支持顺序查询(叶子节点相连) |
不支持范围查询 | 支持范围查询 |
总结:
在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;
其余大部分场景,建议选择B+Tree索引。
索引类型
主键索引和辅助索引
- 主键索引(Primary Key):
- 数据表的主键列使用的就是主键索引。
- 一张数据表有只能有一个主键,并且主键不能为null,不能重复。
- 辅助索引(二级索引):
- 二级索引的叶子节点存储的数据是主键,通过二级索引,可以定位主键的位置。
- 唯一索引,普通索引,前缀索引等索引属于二级索引。
聚集索引与非聚集索引
聚集索引:聚集索引即索引结构和数据一起存放的索引。主键索引属于聚集索引。
优点:查询速度非常快
缺点:
1. 依赖于有序的数据 2. 更新代价大
非聚集索引:索引结构和数据分开存放的索引。二级索引属于非聚集索引。
优点:更新代价小
缺点:
1. 依赖于有序的数据 2. 可能会二次查询(**回表**)
非聚集索引一定回表查询吗?(覆盖索引)
不一定,当索引的key本身就是查询的字段的时候,无需回表!
索引创建注意点
原则
最左前缀原则:在创建联合索引时,尽量把查询最频繁的那个字段作为最左(第一个)字段。查询的时候也尽量以这个字段为第一条件。
适合创建索引的字段
- 不为Null的字段
- 被频繁查询的字段
- 被作为条件查询的字段
- 被经常用于连接的字段
不适合创建索引的字段
被频繁更新的字段
不经常查询的字段
参考
格物:https://shockerli.net/post/1000-line-mysql-note/
javaGuide:https://snailclimb.gitee.io/javaguide/#/docs/database
guoziqing506:https://blog.csdn.net/guoziqing506
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.