16)为什么mysql要使用B+树:一、首先我们的一个表的数据在磁盘上由于插入顺序的原因肯定不是顺序存放,如果按照表字段内容顺序查找,如果一个500万条数据的表,要找的刚好是第500万个值,则需要与磁盘做500万次IO,效率低下。二、为什么不用二叉树,如果将一个乱序的数据放入二叉树中,效率会高,但是如果数据是有顺序的,比如1、2、3、4、5,则二叉树将会编程一个链表的样式,失去了二叉树的优势。三、为什么不用红黑树,红黑树也叫二叉平衡树,红黑树可以有效解决掉顺序数据一次放入二叉树而导致的形成链表的结果,但是红黑树一个节点只能存储一个数据,就导致如果是大量的数据,红黑树的高度就不可控,如果一个红黑树是20的高度,要查询的数据在叶子结点,则表示需要需磁盘20次IO,效率还是不高。四、为什么不用B树,B树比红黑树的优势是,B树是一个节点上存储多个数据,比如磁盘的一页数据,这样的横向扩展,相同的数据量就可以比红黑树减少更多的高度,从而减少了磁盘的IO次数,下面开始对比B树和B+树,就会发现B+树在查询数据方面要比B树有很多便捷的地方 B树:data为数据的磁盘地址,还可能是整条列的数据 1、数据是分散在每个结点上的,所有结点元素不重复, 2、结点元素从左到右递增 3、叶子结点具有相同的深度,叶子结点的指针为空 B+树:data为数据的磁盘地址,还可能是整条列的数据 1、叶子结点包含了所有的索引字段,以及数据的磁盘地址,而非叶子结点不在存储data数据,作用只是便于查找的冗余索引 2、非叶子结点是从子结点选取一页的开头来作为自己的值,指针为子结点那页的地址 3、每一个结点里的值都是排好序的 4、叶子结点之间还有指针可以互相访问,这样方便了范围查找,比如where col > 10,这是mysql对B+的变种,也是对比B树的一个优势 5、由于data可能会很大,非叶子结点在不存储data后,非叶子可以存储的元素则会变多,还可以降低树的高度,提高了查询的效率,这是与B树对比,B+树的一个优势 (注:内存里二分查找数据的范围要比一个IO快的多,所以一次IO加载更多的数据,可以提高查询的效率,一页为多大也可以sql查询与设置)