【mysql学习篇】为什么mysql用B+Tree?

1. 各种数据结构的对比

二叉树

  1. 不会平衡树节点,如果插入一组递增的数值,会导致树的高度很高,查询起来非常耗时

假设{1,2,3,4,5,6 } 一组数据需要存储,那么他的树的高度就为6
【mysql学习篇】为什么mysql用B+Tree?_第1张图片

红黑树(二叉平衡树)

  1. 虽然实现了平衡节点,但是每个节点只能存储一个元素的结构还是会导致树高度很高,不如B树和B+树的索引文件页的方式存储

B树

  1. 每个节点都会存储 data数据(每个节点存储容量就大了),这样每个文件页能存储的索引数就相对来说少了很多

B + Tree

  1. 非叶子节点存储的是冗余的索引字段,只有叶子节点才存储data数据这样每一页文件页能存储的索引就大大的提升了,对应的树的高度也得到了优化
  2. 叶子节点用指针连接,提高区间访问的效率
    【mysql学习篇】为什么mysql用B+Tree?_第2张图片

2. 为什么mysql用B+Tree?

  1. B树和B+Tree每一个节点实际上可以理解为是一个文件页 mysql默认给一个文件页分配16k存储
  2. B树的每个节点都会存储data数据,而B+Tree的话非叶子节点是存储的索引(冗余),不存储data数据,这样每一页文件页能存储的节点就很多,树的高度就可以得到很好的控制,树的高度越高,从磁盘load节点到内存对比的次数就会越多,磁盘I/O是费时
  3. 所以B+Tree在树高度相同的情况下能够存储更多的索引数据,间接的减少了磁盘的I/O操作,B+Tree的I/O次数会更加稳定一些。
  4. 还有就是从范围查询的角度上来说B+Tree也具备绝对的优势,因为B+Tree在每个相邻的叶子节点之间都有互相指向
  5. B+Tree在全表扫描的情况下也是比较占优势的,因为B+Tree的数据都是存储在非叶子节点的,所以只需要扫描叶子节点就可以拿到全部数据了,B Tree的话就需要从头遍历整颗树

查看mysql文件页大小(16K):

SHOW GLOBAL STATUS like 'Innodb_page_size’

3. 为什么不推荐修改mysql一个文件页默认分配的大小?

  1. 每次查找数据都需要把依次索引文件页load到内存进行比较,一个系统会有很多数据库很多表,如果每个文件页的大小设置过大的话,那么就给内存带来了很大的压力,这个值是mysql多次测试得到的最优的大小,一般不推荐修改

你可能感兴趣的:(Mysql,mysql,数据结构,b树)