1. 各种数据结构的对比
二叉树
- 不会平衡树节点,如果插入一组递增的数值,会导致树的高度很高,查询起来非常耗时
假设{1,2,3,4,5,6 } 一组数据需要存储,那么他的树的高度就为6
红黑树(二叉平衡树)
- 虽然实现了平衡节点,但是每个节点只能存储一个元素的结构还是会导致树高度很高,不如B树和B+树的索引文件页的方式存储
B树
- 每个节点都会存储 data数据(每个节点存储容量就大了),这样每个文件页能存储的索引数就相对来说少了很多
B + Tree
- 非叶子节点存储的是冗余的索引字段,只有叶子节点才存储data数据这样每一页文件页能存储的索引就大大的提升了,对应的树的高度也得到了优化
- 叶子节点用指针连接,提高区间访问的效率
2. 为什么mysql用B+Tree?
B树和B+Tree每一个节点实际上可以理解为是一个文件页
mysql默认给一个文件页分配16k存储- B树的每个节点都会存储data数据,而B+Tree的话非叶子节点是存储的索引(冗余),不存储data数据,这样每一页文件页能存储的节点就很多,树的高度就可以得到很好的控制,树的高度越高,从磁盘load节点到内存对比的次数就会越多,
磁盘I/O是费时
。 - 所以B+Tree在树高度相同的情况下能够存储更多的索引数据,间接的
减少了磁盘的I/O
操作,B+Tree的I/O次数会更加稳定一些。 - 还有就是从范围查询的角度上来说B+Tree也具备绝对的优势,因为B+Tree在每个相邻的叶子节点之间都有互相指向
- B+Tree在全表扫描的情况下也是比较占优势的,因为B+Tree的数据都是存储在非叶子节点的,所以只需要扫描叶子节点就可以拿到全部数据了,B Tree的话就需要从头遍历整颗树
查看mysql文件页大小(16K):
SHOW GLOBAL STATUS like 'Innodb_page_size’
3. 为什么不推荐修改mysql一个文件页默认分配的大小?
- 每次查找数据都需要把依次索引文件页load到内存进行比较,一个系统会有很多数据库很多表,如果每个文件页的大小设置过大的话,那么就给内存带来了很大的压力,这个值是mysql多次测试得到的最优的大小,一般不推荐修改