hash索引
优缺点
- 查找效率高【数组下标】
- 无法进行范围查找【hash是无序的值,只能进行全表扫描】
- 无法进行排序操作
二叉查找树
二叉树是每个节点最多有两个子树的树结构,通常子树被称作
左子树
和右子树
。二叉树常被用于实现二叉查找树和二叉堆。
特点:
- 每个节点都包含一个元素以及n个子树。
- 左子树和右子树是有顺序的,次序不能任意颠倒,左子树的值小于父节点,右子树的值要大于父节点。
检索任何一个数据最多只需要访问3个节点,时间复杂度为O(longN),和二分法效率一样。
但是如果插入的数据是有序的,那么结构就会变成:
此时二叉树退化为了一个链表结构,查询数据最差变为O(N)。
优缺点
- 查询数据的效率不稳定,若树左右比较平衡的时候,最差情况为O(logN),如果插入数据是有序的,退化链表查询时间为O(N)
- 数据量大的情况下,会导致
树的高度
变高,如果每个节点对应磁盘的一个块来存储一条数据,需io次数会大幅增加。
平衡二叉树(AVL Tree)
平衡二叉树是一种特殊的二叉树,其次还具有如下特性:
- 左右子树高度差不超过1
- 左右子树是平衡二叉树
优缺点
- 这保证了查询速度比较稳定,查询中遍历节点控制在O(logN)范围内
- 如果在内存中查询比较高,存储在磁盘中,每个节点对应一个磁盘块,数据量大的时候,会导致二叉树变高,
增加io次数
,查询效率变低 - 在数据的
插入
和删除
的过程中,平衡二叉树用了一系列的操作去维护了二叉树的平衡(在频繁变更的列上不适合建索引的原因),这需要IO和CPU的消耗。 - 在树结构中数据处的深度决定着它
搜索时IO次数
,搜索效率不足
。 - 每个磁盘块(节点/页)保存的关键字数据量太少了。
- 没有很好利用操作系统和磁盘数据交换特性和磁盘预读能力。(空间局部性原理)
B-树(多路平衡查找树)
B-树节点可以放多个元素,主要是为了降低树的高度【AVL树所存在的问题】。B-Tree结构的数据可以让系统高效的找到数据所在的磁盘块。多路:关键字+1。
B-Tree不利于范围查找,但是我们经常需要用到范围查找
存在回旋的问题【范围查找】
B+树
B+Tree的主要特征:
- 叶子节点只存储key[index]不存储具体的数据
- 最底层是叶子节点
- 除叶子节点之外,其他节点不保存数据,只保存
关键字
和指针
- 叶子节点包含了
所有数据的关键字
以及data
,叶子节点之间可以用链表
连接起来–支持范围查找。
+通过链表解决回旋查找
MySQL InnerDB采用B+Tree的原因
- B+Tree是B-Tree的变种,多路绝对平衡查找树,他拥有B-Tree的优势
- B+Tree扫库、表能力更强:
只需要扫描子结点
- B+Tree的磁盘读写能力更强:一次IO的数据更多
- B+Tree的排序能力更强
- B+Tree的查询效率更加
稳定
MySQL中B+Tree索引体现形式-MyISAM
所建的索引都是平级关系
MySQL中B+Tree索引体现形式-Innodb
在innodb中只有一个聚集索引–主键
数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。
《MySQL笔记–个人学习总结》