20241225面试鸭特训营第2天

更多特训营笔记详见个人主页【面试鸭特训营】专栏

20241225

1. MySQL 三层 B+ 树能存多少数据?

  • 前置知识点
    • 在MySQL的Innodb存储引擎中,B+树默认数据页的大小为16KB(即每个节点页的大小为16KB == 16384字节)
    • 假设每个数据记录的主键和数据大小为1KB(实际上一般会比这个小,取整是为了方便计算)(即一条数据信息占据1KB)
    • 叶子节点中仅存储数据信息
    • 非叶子节点中存储指向子节点的指针(称为指针信息,假设为6字节)和保存索引信息的数据值(称为数据信息,假设为8字节)
    • 【节点信息】由一个【数据信息】和一个【指针信息】组成,占据14字节
  • 数据量计算
    • 根节点:大小为16KB(16384字节),每个节点信息14字节,可以保存16384 / 14 = 1170 个节点信息,即可以指向 1170 个中间节点
    • 中间节点:原理同根节点,可以指向 1170 个叶子节点
    • 叶子节点:大小为16KB,每条数据信息1KB,可以存储16条数据信息
    • 三层B+树能存储的数据总量为 1170*1170*16 = 21902400 ,即一个三层的B+树能存储约2000万条记录
  • 图示

在这里插入图片描述

2. MySQL 索引的最左前缀匹配原则是什么?

前置知识1:MySQL框架

在这里插入图片描述

  • 连接层:接收客户端的连接、完成连接处理和认证授权、检查是否超过最大连接数
  • 服务层:解析 SQL 的语法、语义、实现了存储过程、触发器、视图、函数等
  • 存储引擎层:负责数据的存储和提

前置知识2:索引下推

  • 前置条件:使用了联合索引

  • 定义:把部分查询条件从服务层下推到存储引擎层,来减少IO次数和需要从表中读取的数据行

最左匹配原则

  • 前置条件:使用了联合索引

  • 定义:使用联合索引进行查询时,查询条件必须包括索引中第一个列的条件信息,然后是第二个第三个列

  • 底层原理:联合索引在B+树中遵循 从左到右 的顺序进行排列,MySQL在查找时会优先使用联合索引中的第一个列属性作为匹配依据,然后再使用第二个第三个列。如果跳过最左侧列属性,会导致无法利用该索引。

  • 举例说明

    • 当前表有一个联合索引(a,b,c)

    • -- 以下查询条件 【符合】 最左匹配原则
      where a = 1;
      where a = 1, b = 2;
      where a = 1, b = 2, c = 3;
      
    • -- 以下查询条件 【不符合】 最左匹配原则
      where b = 2;
      where c = 3;
      where b = 2, c = 3;
      
    • -- 以下查询条件涉及到【索引下推】
      where a = 1, c = 3;
      
      -- 在MySQL5.6版本之前,当前查询条件只能利·a = 1 条件进行筛选
      -- 在MySQL5.6版本之后,当前查询条件会通过【索引下推】,在存储引擎层查询到满足 a = 1 的数据后,再利用 c = 3 过滤掉不符合的数据,然后返回给server层
      

3. 为什么 MySQL 选择使用 B+ 树作为索引结构?

在我看来红黑树是结合了二叉树和AVL树双方优点的进化版,红黑树的前身是234树,234树是一颗4阶B树,所以本质上来说红黑树就是一颗B树,下面说一下我理解的B+树和B树的对比

B+树的特点

  • 多叉树、自平衡、叶子节点存数据、非叶子节点存指针、叶子层有双向链表连接、支持范围查询、高度低、查询效率稳定

B+树和B树对比

  • B树的所有节点都会存储数据信息和索引信息,B+树只有叶子节点中存储数据信息和索引信息,非叶子节点只存储索引信息

  • 由于B+树的叶子层有双向链表连接,B+树支持范围查询、B树不支持范围查询

  • 对于同一组查询数据,由于B+树的层数更低,B+树的平均磁盘IO次数低于B树

  • 由于B+树的所有数据信息都保存在叶子层中,B+树查询效率稳定、B树查询效率不稳定

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值