B树和B+树的区别?为什么MySQL 使用B+树?
B树的特点:
- 节点排序,叶子节点存储了数据
- 叶节点具有相同的深度、叶子节点的指针为空
- 一个节点可以存储多个元素,并且多个元素都按照从左到右递增 排序,所有索引元素不重复
B+树的特点: - 非叶子节点不存储数据、只存储索引,可以放更多的索引
- 在所有的叶子节点中增加了下一个叶子节点的指针
- 非叶子节点上的元素在叶子节点上都冗余了,也就是叶子结点存储了所有的元素并且都排好了序。
Mysql使用的B+树,因为索引是用来加快查询速度的,B+树通过对数据进行排序,所以提高了查询速度,然后通过一个节点中可以存储多个元素,从而让B+树的高度不会太高,在Mysql中一个Innodb页就是一个B+树的节点,一个Innodb页默认16KB,一般情况下一颗2层的B+树可以存储2000万行的数据,利用B+树叶子节点存储了所有数据并且进行了排序,并且叶子节点之间有指针,可以更好的支持全表扫码,范围查找等SQL语句。
二叉树作为索引的数据结构;左子树的键值小于根的键值,右子树的键值大于根的键值。如果遇到连续自增的索引列,会造成链表结构,多次I/O操作 效率低下
平衡二叉树(红黑树):当树失去平衡的时候,可以通过旋转使其恢复平衡,如果索引列太多 会让树的高度更高,树的高度就代表了至少需要进行多少次磁盘I/O操作。
BTree:叶子节点具有相同的深度、叶子节点的指针为空。所有索引元素不重复,节点中的数据从左到右依次递增排列。
B+Tree:非叶子节点不存储数据,只存储索引,叶子节点(默认16KB)包含所有索引字段,以及数据项,叶子节点之间用指针连接,提高访问性能
Hash表:对索引的key进行一次hash计算,定位出存储数据的位置,会出现hash冲突 ,仅仅支持’=‘、’IN‘操作,不支持范围查找。时间复杂度O(1)