目录
索引概述
介绍
索引(index)是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引
演示
表结构及数据:
执行的SQL语句为:select * from user where age = 45;
无索引情况:
在无索引情况下,需要从第一行开始扫描,一直扫描到最后一行,称之为全表扫描,性能很低
有索引情况:
如果建立了索引,假设索引结构是二叉树,则会对age这个字段建立一个二叉树的索引结构:
此时查询只需要扫描三次就可以找到数据,极大提高了查询效率
备注:只是假设索引结构是二叉树,并不是索引的真实结构
优缺点
索引结构
概述
MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:
不同的存储引擎对索引结构的支持情况:
注意:平常所说的索引,如果没有特别指明,都是指B+树索引
二叉树
假如MySQL的索引结构采用二叉树的数据结构,比较理想的结构如下:
如果主键是顺序插入的,则会形成一个单向链表,结构如下:
因此,二叉树的缺点:
- 顺序插入时,会形成一个链表,查询性能大大降低
- 大数据量情况下,层级较深,检索速度慢
如果选择红黑树,红黑树是一棵自平衡二叉树,即使是顺序插入数据,最终形成的数据结构也是一棵平衡的二叉树,结构如下:
即使如此,红黑树也存在缺点:
- 大数据量情况下,层级较深,检索速度慢
B-Tree(B树)
B-Tree(B树)是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉
以一棵最大度数(max-degree)为5(5阶)的B树为例,那这个B树每个节点最多存储4个key,5个指针:
【树的度数指的是一个节点的子节点个数】
数据结构可视化网站:B-Tree Visualization
插入一组数据:100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250
特点:
- 5阶的B树,每一个节点最多存储4个key,对应5个指针
- 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂
- 在B树中,非叶子节点和叶子节点都会存放数据
B+Tree(B+树)
B+树是B树的变种,以一棵最大度数为4(4阶)的B+树为例,结构如下:
两部分:
- 绿色框的部分,是索引部分,仅仅起到索引数据的作用,不存储数据
- 红色框的部分,是数据存储部分,在其叶子节点中要存储具体的数据
可视化演示:B+ Tree Visualization
插入一组数据:100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250
- 所有的数据都会出现在叶子节点
- 叶子节点形成一个单向链表
- 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的
MySQL优化后的B+树:
MySQL索引数据结构对经典的B+树进行了优化,在原B+树的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+树,提高区间访问的性能,利于排序:
Hash
MySQL中除了支持B+树索引,还支持Hash索引
结构:
哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中:
如果两个(或多个)键值映射到一个相同的槽位上,就会产生hash冲突(也称为hash碰撞),可以通过链表来解决:
特点:
- Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< ,...)
- 无法利用索引完成排序操作
- 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+树索引
存储引擎支持:
- 相对于二叉树,层级更少,搜索效率高
- 对于B树,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低
- 相对Hash索引,B+树支持范围匹配及排序操