likes
comments
collection
share

InnoDB 怎么支持范围查找的

作者站长头像
站长
· 阅读数 18

MySQl 专栏持续更新 不说晦涩难懂的东西 尽量输出容易理解 和 使用的SQL技巧 和 初中级开发不是很常用的但很有用的知识

欢迎查看👉🏻👉🏻👉🏻SQL 专栏 查漏补缺 指教一二

InnoDB 怎么支持范围查找的

前言

这些知识的话基本上都是面试比较喜欢问东西 所以就再细分整理一下 一是巩固自己的知识 二是 当作笔记记录 能帮到大家最好

逻辑图

这个是一个主键索引的索引图 最底层是 数据 上面是索引 怎么支持范围查找其实就是怎么去树里面进行数据查询的流程 InnoDB 怎么支持范围查找的

可以看到上图中的 青色块 数据就是我们的索引数据 我们之前经常说的是加索引 其实就是把上面的这些数据页生成出来 InnoDB 默认都会给你加上主键 索引主键索引是一直存在的 在我们进行数据查找的时候

select id from bTree where id = 6 如果我们进行这个数据的查询就会 从上面的页下机型寻找 我们可以看出这个图是越往上 范围越小所以能加快查询速度 上面这个SQL 语句的话执行流程就是如下图

InnoDB 怎么支持范围查找的

在进行查询的时候会通过页数据 进行比较 从而缩小单位找到数据

这种情况是我们使用索引的时候我们的流程但是如果我们不去使用索引的话会怎么去执行

假设我们查询 select id from bTree where code = 7 这个时候我们不会使用索引 索引就不能使用上面的索引页 我们只从最底层的 数据直接可是一个一个的进行对比

InnoDB 怎么支持范围查找的

这个过程就是全表扫描

  • 叶子节点从左往右是全表扫描
  • 索引页从上往下 是索引查询

进入正题

那么通过上面的图基本可以了解在进行数据查询的时候是怎么去走的索引 那么我们在 范围查找的时候是怎么走的索引呢

select id from bTree where id > 6

  • 这个思路很简单是 先找到Id = 6 的数据 定位到数据在哪里

InnoDB 怎么支持范围查找的

然后 在这个数据后面的数据就是>6的数据返回数据就行了

那为什么范围查找索引会失效

最直接的原因我们上面知道 MySQL 可以直接进行全表扫描 当我查询的数据范围过大的时候会导致索引失效

mysql 是否根据首次索引条件查询出的主键进行二次查找,也是要看查询出来的数据量级,如果数据量接近全表数据量的话,就会进行全表扫描,否则根据第一次查询出来的主键进行二次查询。

这些问题是能够融汇贯通的 一点点的 去刨析 一下看完还是不太好的

知识点

  • 索引查询从上往下进行查询
  • 非索引字段 会直接在数据页遍历查询
  • 范围查询的时候 会先找找最近的数据 然后返回后面的数据
  • 范围过大 可能会造成索引失效主要是 MySQL 优化器认为全表扫描更快所以就会放弃进行索引 查询