总结
1、为什么mysql索引使用B+树,而不是用其他数据结构(hash, b树,红黑树,二叉树)?
先说二叉树,现在主键索引大部分都是整型自增的,如果使用二叉树,树的结构最后会变成链表,线性排列,这样查找效率比较低。
再说以下红黑树,因为红黑树是一颗二叉查找树,它树的高度会随着数据的增加而变大,当数据量比较大的时候,而我们要查找的数据位于叶子节点,这样的效率也比较低了。
那为什么用b+树而用b树呢?
B 树与 B+ 树的最大区别就是,B 树可以在非叶结点中存储数据,这也导致在查询连续数据时可能会带来更多的随机 I/O。但是 B+ 树的所有数据其实都存储在叶子节点中,而且B+树的叶子节点有双向指针连接,查找某个范围的数据时,能够减少顺序遍历时产生的额外随机 I/O
不用hash是因为它没办法支持某个范围的查找
2、为什么b+树三层能存储两千万的数据?
B+树的非叶子结点不存储数据,存储的是冗余索引和下一个磁盘存放的位置,我们假设主键ID为bigint类型,长度为8字节,而指针大小在InnoDB源码中设置为6字节,这样一共14字节。而InnoDB种一页就可以存储16kb,这样一计算,一层就可以存储1170对索引与指针,假设一行记录的数据大小为1kb,那么叶子节点可以存储16个,这样三层的话就是1170* 1170 *16约为2190多万
3、为什么表要设置主键,并且推荐使用整形自增的主键?
因为B+树用主键来维护这些数据,如果没有主键mysql会去找一列没有重复的数,加一个唯一索引,维护B+树,但是如果没有找到,他会自己创建一个隐藏列,去维护这些数据创建B+树。这样就增加了mysql的压力。
而为什么要设置为整型呢?
如果不设置为整型而设置为UUID,那么当去查找的时候UUID的比对速度慢于整型的对比速度,因为一个字符一个字符的对比 。
维护自增是为了每次数据的添加就直接再后面尾部完成,树不会产生分裂和调整
4、b树和B+树的区别?
B树叶结点指针为空,所有索引元素不重复,节点种的数据索引从左到右递增排序。
而B+树非叶子节点不存储data,只存储冗余的索引,这样可以放更多的索引。叶子节点包含所有索引字段并且用指针连接,提高区间访问的性能。