22 mysql range 查询

前言
这里主要是 探究一下 explain $sql 中各个 type 

诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 

这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 

以及 相关的差异 

此系列文章建议从 mysql const 查询 开始看

 

测试表结构信息如下 

 
CREATE TABLE `tz_test` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`field1` varchar(12) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3333343 DEFAULT CHARSET=utf8

 

测试数据为序列 1 – 99

6b59f9ee880d4ca4915255d2f0d52dfb.png

 

 

range 查询存在的记录

执行查询如下 “select * from tz_test where field1 > 'field33' and field1 < 'field37';”

 

optimize 的时候, 根据索引定位了 ”field33” 和 “field37” 的位置 

dac2dcf8fd2e4a5ea7e51244f752e8f3.png

 

第一次查询是从索引 ‘field34’ -> 34 开始, 然后 row_search_idx_cond_check 来判断当前记录是否满足条件 

比较的方式是当前记录的给定的字段 是否属于给定的区间, 因为是顺序往下遍历, 只需要判断是否超出了 右边界 即可

7353b8cdc54d42e69b85d9c1a015d2bf.png

 

这里是将 rec 转换为 mysql_rec 的地方

bc30eac8c3b6445ab950ed46cf4b81d4.png 

这里根据索引的区间判断是没有使用到 prebuilt->fetch_cache 的 

然后在迭代的过程中会依次比较 “field36”-> 36, “field37”->37 的记录信息, id 为 35 的记录 field1 为 “field33”, 索引是按照顺序排列的, 因此是不会遍历到索引 “field33” -> 35 -

迭代到 “field36” -> 36 的时候满足条件, 因此获取给定的记录返回回去

迭代到 “field37” -> 37 的时候, 一边是索引记录的值 “field37”, 另外一边是查询条件中的 “field37”

然后这里比较 两者相等, 外面根据查询条件是否包含 “等于”, 来更新这里的比较结果 

来符合我们的一个 “<”/”<=” 的一个计算需求 

941f3aa5ead0464d9edfca0dcb589201.png

 

我们这里查询条件为 “field1 < 'field37';”, 因此在 “field37” = “field37” 的场景下面是不满足需求的, 因此这里设置了一个 如果两者相等的时候的一个默认值, 这里为 1 表示 OUT_OF_RANGE

key_compare_result_on_equal 是在之前设置的, 根据查询条件动态调整 

b883a3c8578b46e0a2ee2723073226f1.png

 

然后外层 row_search_mvcc 控制着外层跳出循环 

2df2be13a21a4f8c8beeb316d3bfee12.png 

然后外层 sub_select 跳出循环 

d48298aeb8024a988204de7191bf8f6b.png 

 

range 使用索引 or 不使用索引 ?

假设执行查询如下 “select * from tz_test where field1 > 'field33';”

这里比较的两个 estimate, 一个应该是 全表扫描 的开销, 另外一个是使用 field1 索引的开销 

cost 的 io_cost 为扫描的记录数量, cpu_cost 为计算的 cpu 开销 

allTableEstimate 的计算方式不太清楚, 这里合计为 23[每次计算可能有所差异, 我们这里仅仅以这次调试为例], 所以 可以推导出的是如果 range 查询记录数量超过了 23 是肯定使用 全表扫描 

7f917f51f58346fd8e7b6f8fc3a55589.png

 

假设执行查询如下 “select * from tz_test where field1 > 'field97';”

这里很显然就会使用 field1 字段的 range 查询 

3cbe418f714a4bacb4fd27216007fb3e.png

 

假设执行查询如下 “select * from tz_test where field1 > 'field81';”

选择全表扫描 

91a332a65eae4779a16ae0a802d5d52e.png

 

假设执行查询如下 “select * from tz_test where field1 > 'field82';”

选择索引查询 

8c37fe47d6cd4c63b3d6ae9c3f4953aa.png

 

 

 

  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/120932.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟着Nature Plant学图形颜色搭配 | caecopal包

写在前面 今天在Nature Plant(IF:16.0)期刊中看到文中的图形&#xff0c;进一步的查看后发现作者使用一个R包来进行图形颜色的搭配。就此机会也分享给大家&#xff0c;若你需要可以进一步查看及使用此包。 对于图形颜色的搭配&#xff0c;对于文章整体美观是非常重要。但是&a…

Docker介绍与安装

目录 一、Docker 概述 1、什么时Docker 2、Docker的设计宗旨 4、Docker的优点 5、Docker容器和虚拟机的区别 6、 namespace的隔离&#xff08;命名空间&#xff09; 7、 Docker的三个核心概念 7.1 镜像 7.2 容器 7.3 仓库&#xff08;Docker Hapu&#xff09; 二、D…

Unity中Shader通道ColorMask

文章目录 [TOC](文章目录) 前言一、ColorMask是用来干什么的二、怎么做到和 Unity UI 中的 Shader 一样根据UI层级自动适配Shader中模板测试值1、借鉴Unity官方的 UI Shader 前言 Unity中Shader通道ColorMask 一、ColorMask是用来干什么的 ColorMask RGB | A | 0 | R、G、B、…

c语言练习70:反转两次的数字

反转两次的数字 题⽬描述&#xff1a; 反转 ⼀个整数意味着倒置它的所有位。 例如&#xff0c;反转 2021 得到 1202 。反转 12300 得到 321 &#xff0c;不保留前导零 。 给你⼀个整数 num &#xff0c;反转 num 得到 reversed1 &#xff0c;接着反转 reversed1 得到 revers…

Android AMS——APP启动流程(三)

Android 应用启动方式主要有两种 , 冷启动和热启动。 冷启动:后台没有应用进程 , 需要先创建进程 , 然后启动 Activity ;热启动:后台有应用进程 , 不创建进程 , 直接启动 Activity ; 其实,还有一种温起动的方式,就是用户按了返回键退出应用,随后又从新启动,可是活…

C理解(四):链表

本文主要探讨单链表与双链表相关知识。 linux内核链表(include/linux/list.h) 内核链表中纯链表封装,纯链表的各种操作函数&#xff08;节点创建、插入、删除、遍历&#xff09;,纯链表内嵌在驱动结构体中,实现驱动的创建、插入、删除、遍历等 单链表 单链表链表头插…

【每日一题】2769. 找出最大的可达成数字

2769. 找出最大的可达成数字 - 力扣&#xff08;LeetCode&#xff09; 给你两个整数 num 和 t 。 如果整数 x 可以在执行下述操作不超过 t 次的情况下变为与 num 相等&#xff0c;则称其为 可达成数字 &#xff1a; 每次操作将 x 的值增加或减少 1 &#xff0c;同时可以选择将 …

JMM与JUC

1.JMM 问题1&#xff1a;请你谈谈你对Volatile的理解 Volatile 是java虚拟机提供轻量级的同步机制 1. 保证可见性 2. 不保证原子性 3. 禁止指令重排 1.1、什么是JMM JMM Java内存模型 不存在的东西&#xff0c;概念&#xff01;约定 &#xff01; 1.2、关于JMM的一些同…

GD32工程创建

1.创建空工程 在任意路径下创建空的test文件夹。打开keil5空工程创建空工程 选择对应的芯片型号&#xff1a; 然后把空工程保存到test文件夹下。会自动生成如下文件。 2. 添加组 下载GD32F10X的固件库&#xff1a;在百度里搜索GD32进入官网。 下载下来对应的文件如下&#xff…

Word | 简单可操作的快捷公式编号、右对齐和引用方法

1. 问题描述 在理工科论文的写作中&#xff0c;涉及到大量的公式输入&#xff0c;我们希望能够按照章节为公式进行编号&#xff0c;并且实现公式居中&#xff0c;编号右对齐的效果。网上有各种各样的方法来实现&#xff0c;操作繁琐和简单的混在一起&#xff0c;让没有接触过公…

Linux性能优化--性能工具-系统CPU

2.0.概述 本章概述了系统级的Linux性能工具。这些工具是你追踪性能问题时的第一道防线。 它们能展示整个系统的性能情况和哪些部分表现不好。 1.理解系统级性能的基本指标&#xff0c;包括CPU的使用情况。 2.明白哪些工具可以检索这些系统级性能指标。2.1CPU性能统计信息 为了…

LeetCode 接雨水 双指针

原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题面&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a…