阅读 51

InnoDB 怎么支持范围查找的

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

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

src=http __img2.biaoqingjia.com_biaoqing_201810_2c3993f64eec252da6d674f9d80fc4e9.gif&refer=http __img2.biaoqingjia.gif

前言

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

逻辑图

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

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

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

图片.png

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

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

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

图片.png

这个过程就是全表扫描

  • 叶子节点从左往右是全表扫描

  • 索引页从上往下 是索引查询

进入正题

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

select id from bTree where id > 6

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

图片.png

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

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

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

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


作者:变成派大星
链接:https://juejin.cn/post/7168452332219924494


文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐