1hash
Hash表,在Java中的HashMap,TreeMap就是Hash表结构,以键值对的 形式存储数据。我们使用hash表存储表数据结构,Key可以存储索引列, Value可以存储行记录或者行磁盘地址。Hash表在等值查询时效率很高,时间 复杂度为O(1);但是不支持范围快速查找,范围查找时只能通过扫描全表的方 式,筛选出符合条件的数据。
显然这种方式,不适合我们经常需要查找和范围查找的数据库索引使用。
2二叉树 (基础版)
二叉树:每个节点最多有两个分叉节点,左子 树和右子树数据按顺序左小右大。
二叉树的特点就是为了保证每次查找都可以进行折半查找,从而减少IO次数。
但是二叉树不是一直保持二叉平衡,因为二叉树很考验根节点的取值,因为很 容易在某个节点下不分叉了,这样的话二叉树就不平衡了,也就没有了所谓的能进行 折半查找了,如下图:
举例:数据库中数据是不断增多的,假如根节点为10,以后的数据都会在右侧,数据越多,性能越差
3平衡二叉树(升级)
平衡二叉树采用的是二分法思维,平衡二叉查找树除了具备二叉树的特 点,最主要的特征是树的左右两个子树的层级最多差1。
在插入删除数据时通过 左旋/右旋操作保持二叉树的平衡,不会出现左子树很高、右子树很矮的情况。
使用平衡二叉查找树查询的性能接近与二分查找,时间复杂度为 O(log2n),查询id=6,只需要两次IO
就上述平衡二叉树的特点来看,其实是我们理想的状态下,然而其实内部 还是存在一些问题: 时间复杂度和树的高度有关。树有多高就需要检索多少次,每个节点的 读取,都对应一次磁盘的IO操作。树的高度就等于每次查询数据时磁盘 IO操作的次数。磁盘每次寻道的时间为10ms,在数据量大时,查询性 能会很差。(1百万的数据量,log2n约等于20次磁盘IO读写,时间消 耗约等于:20*10=0.2S)。 平衡二叉树不支持范围查询快速查找,范围查询需要从根节点多次遍 历,查询效率不高。
简单的介绍一下红黑树:特点,平衡节点防止退化成链表结构
平衡二叉树有可能退化成链表结构的,所以就有了红黑树,为啥数据库不用红黑树呢? 节点存储元素太少导致树的高度太高查询速度不快
4 B树(升级)
介绍一下结构:
data:里面是我们的数据,只要是带data的那个节点都是可以直接获取数据得。例如:15,40,7,12
优势:首先每一个节点处,都是可以存放很多数据和指针的。这就会让我们的数据层级很少,查询更快
单条数据查询很快:例如:查询数据2的索引,2小于15,在指针p1的磁盘下,找到磁盘2.
一次类推,找到磁盘5,找到数据。
缺点:批量查询数据稳定性不是很好(有可能慢,有可能快),
例如查询 8-26的数据:查找到8之后,需要回到根节点重新遍历查找, 需要从根节点进行多次遍历,查询效率有待提高
5B+树(升级)
B+树,作为B树的升级版,
B+树和B树最主要的区别:B+树 是只有叶子节点存储数据 B树不是。
优点:
查询更加稳定,
节点可以存放指针更多了(只能叶子节点才能存data),这样层级更加少了,io更少了。
举例:查询15-30数据:
经历就会是4步即可。
如何应用的呢(InnoDB)?
例如:SELECT * FROM `test` WHERE id=15 ,
它会先判断这个sql走没走索引,走了就会去走索引查询,直接查询到这条数据。