MySQL 索引高频面试题全解析:B + 树、联合索引、索引失效

目录

B+树的特性是什么?

说说B+树和B树的区别

B+树的叶子节点链表是单向还是双向?

B+树的好处是什么?

[联合索引ABC,现在有个执行语句是A = XXX and C < XXX,索引怎么走](#联合索引ABC,现在有个执行语句是A = XXX and C < XXX,索引怎么走)

索引失效的场景


B+树的特性是什么?

1.所有叶子节点都在同一层: B+树中所有叶子节点在最外层,保证每一个检索的I/O延迟都是相等的,每一个叶子节点都有指向邻叶子节点的指针,这样下去形成了一个链表,所以B+树十分有利于范围查找,查找效率高,不需要随机查找了

2.非叶子节点存储的只有主键值和指向下一层的指针: 所有的非叶子节点不存储对应主键数据,这样大大减少了树的高度,提高了数据的检索效率,并且在叶子节点存储的数据量也变大

3.所有的主键数据都在叶子节点:

与B树不同,B+树的叶子节点存储实际的数据记录或指向数据记录的指针。这意味着每次搜索都会到达叶子节点,才能找到所需数据。

**4.修改数据之后自平衡:**每一次修改数据时,B+树都会自动重新平衡,确保树的高度保持相对稳定,保持良好的搜索性能,每个节点最多可以有M个子节点,最少可以有ceil(M/2)个子节点(除了根节点),这里的M是树的阶数。

说说B+树和B树的区别

1.在B+树中,数据都存储在叶子节点上,而非叶子节点只存储索引信息;而B树的非叶子节点既存储索引信息也存储部分数据。

  1. B+树的叶子节点组成了链表,B树没有

3.B+树搜索性能更稳定,B+树每一次搜索都要到达叶子节点,B树可能在非叶子节点搜索停止,

B+树的叶子节点链表是单向还是双向?

双向的,为了实现倒序遍历或者排序

Innodb 使用的 B+ 树有一些特别的点,比如:

  • B+ 树的叶子节点之间是用「双向链表」进行连接,这样的好处是既能向右遍历,也能向左遍历。
  • B+ 树点节点内容是数据页,数据页里存放了用户的记录以及各种信息,每个数据页默认大小是 16 KB。

Innodb 根据索引类型不同,分为聚集和二级索引。他们区别在于,聚集索引的叶子节点存放的是实际数据,所有完整的用户记录都存放在聚集索引的叶子节点,而二级索引的叶子节点存放的是主键值,而不是实际数据。

因为表的数据都是存放在聚集索引的叶子节点里,所以 InnoDB 存储引擎一定会为表创建一个聚集索引,且由于数据在物理上只会保存一份,所以聚簇索引只能有一个,而二级索引可以创建多个。

B+树的好处是什么?

B+树和B树都是多叉树,这种方式减少了树高,很适合检索磁盘内容。

1.B+树的数据都存储在叶子节点,这样非叶子节点存储主键值,因此在数据量相同的情况下,B+树比B树非叶子节点可以存放更多主键值,所以B+树会比B树更矮胖,这样磁盘查询的I/O次数会更少

2**.B+树有大量冗余节点(所有非叶子节点都是冗余索引)**,这些冗余索引让 B+ 树在插入、删除的效率都更高,比如删除根节点的时候,不会像 B 树那样会发生复杂的树的变化;

3.B+ 树叶子节点之间用链表连接了起来,有利于范围查询,而 B 树要实现范围查询,因此只能通过树的遍历来完成范围查询,这会涉及多个节点的磁盘 I/O 操作,范围查询效率不如 B+ 树。

联合索引ABC,现在有个执行语句是A = XXX and C < XXX,索引怎么走

根据最左匹配原则,A可以走联合索引,C不会走联合索引,但是C可以走索引下推

索引下推(ICP) :就是在索引里直接把 C 的条件过滤掉,不用回表查整行数据。

索引失效的场景

6 种会发生索引失效的情况:

  • 当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效;
  • 当我们在查询条件中对索引列使用函数,就会导致索引失效。
  • 当我们在查询条件中对索引列进行表达式计算,也是无法走索引的。
  • MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较。如果字符串是索引列,而条件语句中的输入参数是数字的话,那么索引列会发生隐式类型转换,由于隐式类型转换是通过 CAST 函数实现的,等同于对索引列使用了函数,所以就会导致索引失效。
  • 联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
  • 在 WHERE 子句中,如果 OR 连接的条件里有任何一个列没有建立索引 ,通常就会导致索引失效、走全表扫描(和前后顺序无关)。MySQL 5.1 起引入了 index_merge 优化,当满足条件时优化器可能会对多个索引做合并(union / intersect)读取,但并不总是生效,依赖具体数据分布与优化器成本估算。
相关推荐
重生之小比特1 小时前
【MySQL 数据库】视图
数据库·mysql
Languorous.1 小时前
MySQL 零基础安装教程(Windows11/10,图文分步,新手零失败)
数据库·mysql·adb
不断高歌1 小时前
MySQL基础随堂笔记4
笔记·mysql
牛马鸡niumasi1 小时前
Mysql:索引与B+树
mysql
Java成神之路-1 小时前
MySQL 函数索引与虚拟列深度解析
mysql
橘子海全栈攻城狮1 小时前
【最新源码】基于springboot的快递物流平台的设计与实现C102
java·开发语言·spring boot·后端·spring·web安全
梦梦代码精1 小时前
开源智能体平台 BuildingAI 深度解析:Monorepo 架构、MCP 集成及 GPT-Image-2 接入实测
前端·人工智能·后端·gpt·开源·github
fanzhonghong1 小时前
javaWeb开发之前端实战(Tlias案例-部门管理)
前端·后端·web·前后端分离
Languorous.1 小时前
Linux 系统安装 MySQL(CentOS8/Ubuntu),命令行实操完整版
linux·mysql·ubuntu