一、索引概述
1. 介绍
- 索引(index)是帮助MySQL高效获取数据的数据结构(索引是有序的)。
- 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
2. 举例
3. 优缺点
二、索引结构
1. 介绍
MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构。
2. 举例
- 平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。
4. 二叉树
- 二叉树在顺序插入时,会形成一个链表,查询性能大大降低。
- 在大数据量情况下,二叉树的层级较深,检索速度慢。
5. 红黑树
- 红黑树是自平衡的二叉树(特殊的二叉树),可以解决二叉树的顺序链表问题。
- 但是红黑树本身也是二叉树,同样也存在大数据量下,层级较深,检索速度慢的问题。
6. B树
- B树(B-Tree:多路平衡查找树)
- 树的度数指的是一个节点的子节点个数,一颗最大度数(max-degree)为5(5阶)的B树,其每个节点的子节点个数最多为5个,且其最多存储4个key和5个指针。
- 每个节点都存储了索引值+数据。
7. B+树
- B+树实际上是B树的变种
- 在B+树中所有的元素(索引值+数据)都出现在叶子节点,非叶子节点只存储索引值,起到索引的作用。
- 每一个叶子节点都存储一个单向指针,指向下一个叶子节点,最终形成一个单向链表。
8. MySQL中的B+树索引结构【重要】
- MySQL索引数据结构对经典的B+树进行了优化
- 在原B+树的基础上,增加一个指向相邻叶子节点的指针,形成了带有顺序指针的B+树,提高区间访问的性能。
9. Hash索引
- Hash索引就是采用一定的Hash算法,将键值换算成新的Hash值,映射到对应的槽位上,然后存储在Hash表中。
- 如果两个(或多个)键值,映射到同一个槽位上时,就会产生Hash冲突(也成Hash碰撞),可以通过链表解决。
- Hash索引只能用于对等比较(=,in)不支持范围查询(between,>,<,…)
- Hash索引无法利用索引完成排序操作,因为Hash运算出来的结果是无序的
- 但是其查询效率高,通常只需要一次检索就能查出,效率通常要高于B+树索引
- 在MySQL中,支持Hash索引的是Memory引擎,但是InnoDB引擎中具有自适应Hash功能,根据B+树索引在指定条件下自动构建Hash索引