【总结】mysql索引

总结

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,只存储冗余的索引,这样可以放更多的索引。叶子节点包含所有索引字段并且用指针连接,提高区间访问的性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值