写点什么

MySQL 面试题:谈谈 MySQL 索引,B,java 面试常问的面试题

作者:MySQL神话
  • 2021 年 11 月 27 日
  • 本文字数:1437 字

    阅读完需:约 5 分钟

二、B-树、B+树概念



B 树

即二叉搜索树:


  1. 所有非叶子结点至多拥有两个儿子(Left 和 Right);

  2. 所有结点存储一个关键字;

  3. 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;


如:


B-树

是一种多路搜索树(并不是二叉的):


  1. 定义任意非叶子结点最多只有 M 个儿子;且 M>2;

  2. 根结点的儿子数为[2, M];

  3. 除根结点以外的非叶子结点的儿子数为[M/2, M];

  4. 每个结点存放至少 M/2-1(取上整)和至多 M-1 个关键字;(至少 2 个关键字)

  5. 非叶子结点的关键字个数=指向儿子的指针个数-1;

  6. 非叶子结点的关键字:K[1], K[2], …, K[M-1];且 K[i] < K[i+1];

  7. 非叶子结点的指针:P[1], P[2], …, P[M];其中 P[1]指向关键字小于 K[1]的子树,P[M]指向关键字大于 K[M-1]的子树,其它 P[i]指向关键字属于(K[i-1], K[i])的子树;

  8. 所有叶子结点位于同一层;


如:(M=3)



B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;


B-树的特性:


  1. 关键字集合分布在整颗树中;

  2. 任何一个关键字出现且只出现在一个结点中;

  3. 搜索有可能在非叶子结点结束;

  4. 其搜索性能等价于在关键字全集内做一次二分查找;

  5. 自动层次控制;


由于限制了除根结点以外的非叶子结点,至少含有 M/2 个儿子,确保了结点的至少利


《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享


用率。


所以 B-树的性能总是等价于二分查找(与 M 值无关),也就没有 B 树平衡的问题;


由于 M/2 的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占 M/2 的结点;删除结点时,需将两个不足 M/2 的兄弟结点合并;

B+树

B+树是 B-树的变体,也是一种多路搜索树:


  1. 其定义基本与 B-树同,除了:

  2. 非叶子结点的子树指针与关键字个数相同;

  3. 非叶子结点的子树指针 P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);

  4. 为所有叶子结点增加一个链指针;

  5. 所有关键字都在叶子结点出现;


如:(M=3)



B+的搜索与 B-树也基本相同,区别是 B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;


B+的特性:


  1. 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

  2. 不可能在非叶子结点命中;

  3. 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

  4. 更适合文件索引系统;


三、建索引的几大原则




1.最左前缀匹配原则,非常重要的原则,mysql 会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如 a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d 是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d 的顺序可以任意调整。

总结

蚂蚁面试比较重视基础,所以 Java 那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年 1 班,很有青春的感觉。面试官基本水平都比较高,基本都 P7 以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。




经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级 Java 面试题集合,附带超详细答案,希望能帮助到大家。



本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

MySQL神话

关注

还未添加个人签名 2021.11.12 加入

还未添加个人简介

评论

发布
暂无评论
MySQL面试题:谈谈MySQL 索引,B,java面试常问的面试题