hash
假设我们使用数组+链表的方式,对数组进行hash计算,数组的长度是8,那么hash一次,就是对数组的长度取余,也就是 数据值%8=放入索引的位置,10%8=2,也就是10放入索引2的位置
使用链表就是为了防止hash冲突,因为有的数据hash计算会存在相同的数据,虽然数组速度非常快,但是如果数据都放在了链表中,那么在范围查找的时候,就需要多次遍历,速度非常慢
所以mysql底层 也不会采用hash
二叉树
二叉树的特点就是,比根节点小的放在左子树,比根节点小的放在右子树,比根节点大的放在右子树,查找的时候可以一半的时间进行查询,但是在最差的情况下,
会退化成链表,要么都是左子树,要么都是右子树,树的高度也非常高,所以mysql底层也不使用二叉树
红黑树
红黑树是一种平衡的二叉树,他的节点为了保证平衡需要经历多次旋转,树的高度越高,那么就会非常耗时,所以mysql底层也不使用红黑树
b树
b树每个节点存储key,value,data,key就是主键值,value就是下一个指针页码的位置,也是磁盘的物理位置,就是存放在linux服务器,某个文件夹下的某个文件里面
,data存储这个主键对应的一行数据,而且key的值 是不能重复的,适合精确查询,但是在范围查询的时候,需要多次回表操作,就是需要从新 从根节点开始,一点点去往下找
所以mysql底层,也不使用b树
b+树
b+树就是对b树的升级,这里区分叶子节点和非叶子节点,叶子节点就是最后一层节点
非叶子节点key存储主键,value存储下一个页码的位置,非叶子节点不存储行数据,也就是data
而叶子节点存储完整的行记录,每个节点的key值是可以重复的
节点与节点之间构成了双向的链表,非常适合范围查询,不需要回表
从左边到右边依次是从小到大的,也就是有序,这也就是为啥我们使用索引查询的时候,数据都是有序的
所以mysql最终选择了b+树