助你拷打面试官day18,看看你能回答出来吗?
1、mysql索引的底层数据结构是什么?为什么选择b+树,而不是二叉树、平衡二叉树、红黑树、b树?
-
mysql索引的底层数据结构是什么?
-
默认存储引擎innodb使用的是b+树作为索引的存储结构
-
补充:
(1)索引其实是一种可以提高查询速度的数据结构,市面上有非常多不同类型的索引,不同类型的索引底层可以用不同的数据结构
(2)我们这里只讨论是比较常用的innodb存储引擎,比如myisam的底层严谨来说用的是类似b+树的数据结构
(3)其实mysql默认存储引擎innodb支持的索引类型可不止b+树这种,不过一般我们讨论mysql索引的底层数据结构就讨论b+树就够了,其实还有hash、全文搜索full text和地理位置搜索r-tree,首先hash其实也是mysql常用的索引类型,在精准查询的场景,查询效率甚至比b+树还好,相比hash来讲b+树更加适合范围查询、模糊查询等场景,全文搜索建议还是使用更加专业的es,地理位置搜索还是使用更加专业的es、mongodb或者redis,专业的事还是交给专业的人
-
为什么选择b+树,而不是二叉树、平衡二叉树、红黑树、b树?
为什么不是二叉树?
为什么不选择平衡二叉树?
为什么不选择红黑树?
为什么不选择b树?
为什么选择b+树?(面试也经常问你详细介绍一下b+树的结构)
补充:市面上没有b减树的,还有mysql上边选择索引类型的时候虽然显示是b树,但是其实底层是mysql增强过后的b+树
-
当极端情况下在某个桶插入的数据是有序的时候,普通二叉树会退化为链表,这时候查询的时间复杂度就会降为O(n)
-
平衡二叉树虽然相比普通二叉树来讲,有自平衡旋转的机制可以维持树形结构,保证查询效率,但是在旋转的过程中可能会导致树的大面积旋转,影响增删改的效率
-
红黑树有旋转和变颜色来维持树形结构和避免大范围树节点的旋转,但是红黑树是更加适合内存的数据结构,但是换做磁盘的话,因为红黑树一个节点只能存储一个数据,然后每一层查询会进行一次磁盘io,一次磁盘io只能读取一个节点也就是一个页,相当于一次磁盘io只能读取一个数据,效率太低了,我们期望是3次磁盘io是比较优的,而且一个页不管有没有存满,都会分配一段连续的空间(默认16k),一个节点只能存储一个数据,也浪费空间
-
b树可以做到一个节点也就是一个页存储多个数据,并且数据都是排好序的,这样一次磁盘io可以查到很多数据到内存,然后在内存中做一次二分查找,这样性能还是不错的,树的层高可以压缩,所以b树也可以开始称之为矮胖树,并且不再是二叉树,而是迈向多叉树,也有人叫做b more树,但是由于一个页的大小是有限制的,一个页既要存储索引数据还要存储完整的数据(聚簇索引存储整一行数据,非聚簇索引存储索引数据和id),那么一个页就存储不了太多行的数据,这样树还是比较高的,树比较高意味着更多的磁盘io,而且b树是没有冗余数据的,所以会导致查询并不稳定,意思就是有时候可能查到第二层就找到了,有时候查到第三层才找到
-
b+树是在b树的基础上发展过来的,首先非叶子节点不再存储完整的数据,只存索引数据,而叶子节点才存储完整的数据(聚簇索引存储整一行数据,非聚簇索引存储索引数据和id),同时b+树是有冗余数据的,属于空间换时间的思想,也是矮胖树,层数比b树更低,一般我们希望控制在3层,也就是3次磁盘io是比较优的,以每一行数据平均按照1kb来算,3层大概估算可以存储两千多万行数据,b+树当然也是多叉树,按照这个设计的话,每次查询都要查到叶子节点才能停止,这样b+树的查询是稳定的,而且叶子节点增加了单向链表方便范围查询,截止到目前为止这就是数学意义上的b+树,但是其实mysql的真正底层的b+树对数学意义上的b+树还做了增强,比如对叶子节点使用的是双向链表方便双向范围查询
-
总结一下b+树和b树的区别(面试也经常问) (1)b+树有冗余节点,b树没有,所以b+树的层高可以更低 (2)b+树的非叶子节点只存储索引数据,不存储完整数据,叶子节点才存储索引数据和完整数据,B树每个节点都存储索引数据和完整数据 (3)b+树的叶子结点相互之间加了双向链表指向,b树叶子节点没有链表
补充:
(1)一般我们说的能够走索引,指的是可以从b+树的根节点从上往下扫描一直到叶子节点的过程,这就是可以称得上走了索引
(2)不要以为索引只用于查询select,像delete删除和update更新后边都可以带where条件,所以索引也是可以用在更新和删除的
2、聚集索引和非聚集索引的区别
-
聚集索引的叶子节点除了存储索引数据之外,还会存储完整一行的数据,一张表只会有一个聚集索引
-
非聚集索引的叶子节点除了存储索引数据之外,只会存储主键id,不存储完整一行的数据,一张表可以有多个非聚集索引
补充:聚集索引也叫聚簇索引、一级索引和主键索引,非聚集索引也叫非聚簇索引、二级索引和非主键索引
3、你做过的需求有出现过延期吗?一般是什么原因导致的?一般怎么处理?
-
你做过的需求有出现过延期吗?
-
我手上负责过的需要没有出现过延期
-
-
一般是什么原因导致的?
-
如果真有延期,大部分有可能是需求的临时变更
-
-
一般怎么处理?
-
首先我会先了解清楚需求的变更内容,然后进行评估,如果改动量比较小和不影响预定交付时间的话,那就和项目经理报备一下就协助改了,如果改动比较大的话,我会及时和项目经理汇报,让项目经理协调,比如延长完成时间,要么不改变原有完成时间的情况下加入更多人手,还有一种方案就是这一期上线先完成这个需求中最核心最迫切的内容,紧急性没有那么高的可以留到下一期上线完成
-









