20 mysql const 查询

前言

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

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

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

以及 相关的差异 

 

测试表结构信息如下 

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

7a149e47c9ab48b894cd7508e1e49627.png

 

 

const 查询存在的记录

这里以主键查询来调试一下 这里的整个流程

select * from tz_test where id = 33;

 

这里是主键查询, 首先根据index获取所属分页, 然后在目标分页进行 pageDirectory 的二分查找 

然后再根据用户记录 线性查找, 找到目标记录, 将 cursor 存储与 prebuilt->pcur->btr_cur->page_cur->rec

然后 后续的迭代是基于这个 记录开始迭代的 

8a9e7d1a117b4f66a203c728cb59f09b.png

 

我们来看一下 ‘field33’ 记录附近的内存信息的一个剖析

下面的tuple->fields->data 记录的是比较的条件 

33ffedaac30647fe8c04a9a7c9c7c95b.png

 

row_search_mvcc 流程中 ”where id = 33” 条件的比较判断 

2b6a6be998fe4bfc96d9d293bbd69cd0.png 

比较的流程如下, 按照字段逐个比较 

如果有一项比较出结果, 直接返回, 如果 所有的字段均匹配上响应 0

6c06a5ac068a4b8bb0613a772395ff0d.png

 

int 以及 一部分类型的比较方式如下, int 的比较如下 逐字节比较

其次使用 memcmp 比较两个字节序列 

6ee21157044e49d190e9d477acb10847.png

 

将 rec 复制到 mysql_rec[外部传入的 READ_RECORD 的 buf]

af49b772ac6e4d75845f8bb072445c65.png 

rec 和 mysql_rec 的相关 

de535a324c2f45cd88a5fb9bb69775bc.png 

然后 记录往后迭代, 迭代到 field34 对应的记录 7884633de9cc443a92e51195f6e2578f.png 

然后下一次迭代, 继续进入这里的比较, 两者不相等, row_search_mvcc 执行结束 

6cfff1865bbb491082fe70714a8a2e90.png

 

将结果输出给客户端的地方如下 

f0a037c07edd4c6f97d5525cb5a068a7.png 

当前查询是一个 const 查询计划, 只会返回 0条 或者 1条 记录

因此, 这里就直接 退出查询了, 没有查询记录的迭代 

e3e5b950a8714093a5af4356388eb0da.png

 

 

const 查询不存在的记录

在 optimize 的时候, 发现没有匹配到的记录, 这里 打上了一个标记

78ddfd94930e4146b3a04199a48500e2.png

 

初始化的时候 const_table_map 初始化为 1

7606f2231abc4b509090eb161dbbc09b.png 

join_read_const_table 是根据主键条件去查询记录, 结果没有查询到 返回状态 -1

然后 这里 found_const_table_map 一直是 0, 和后面匹配不上 

9f0b9e56f97a4c64a641ee902d55cec9.png 

根据 index 去获取 page, 根据 pageDirectory, record 去比较之后找到的最近的记录 

然后 这里根据 ”where id = 33333” 比较失败, 返回 DB_RECORD_NOT_FOUND

然后 外层对异常进行处理, 最终 join_read_const_table 拿到的状态为 -1

最终 const_table_map 和 found_const_table_map 匹配不上, 进而标记了 zero_result_cause

ef0ba96b9fff466eba63791ee3826e94.png 

然后 外层执行查询的时候, 发现有 zero_result_cause, 直接仅仅响应了元数据回去 

79471f1d56ca4e15a96a6ec8371a1716.png 

 

完 

 

 

 

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

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

相关文章

Python 计算三角形面积

"""计算三角形面积介绍:已知三角形边长分别为x、y、z,可以计算三角形半周长q,然后根据海伦公式计算三角形面积S三角形半周长:q (x y z) / 2三角形面积:S (q * (q-x) * (q-y) * (q-z)) ** 0.5知识点…

HCIE-容器docker

1、安装配置操作系统,使用CentOS stream 8镜像 之前:RHEL 8.4 发布了,CentOS紧随其后,发布CentOS 8.4 之后:CentOS 走在前面,成为RHEL上游,再去发布RHEL 制作模板,模板配置要求&…

计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-图像去噪 [北邮鲁鹏]

目录标题 参考学习链接图像噪声噪声分类椒盐噪声脉冲噪声对椒盐噪声&脉冲噪声去噪使用高斯卷积核中值滤波器 高斯噪声减少高斯噪声 参考学习链接 计算机视觉与深度学习-04-图像去噪&卷积-北邮鲁鹏老师课程笔记 图像噪声 噪声点,其实在视觉上看上去让人感…

用AVR128单片机的音乐门铃

一、系统方案 1、使用按键控制蜂鸣器模拟发出“叮咚”的门铃声。 2、“叮”声对应声音频率714Hz,“咚”对应声音频率500Hz,这两种频率由ATmega128的定时器生成,定时器使用的工作模式自定,处理器使用内部4M时钟。“叮”声持续时间300ms&#x…

[python 刷题] 49 Group Anagrams

[python 刷题] 49 Group Anagrams 题目: Given an array of strings strs, group the anagrams together. You can return the answer in any order. An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically…

LabVIEW报表生成工具包时出现错误-41106

LabVIEW报表生成工具包时出现错误-41106 使用LabVIEW报表生成工具包创建Excel报告或Word文档时,收到以下错误:Error -41106 occurred at NI_Excel.lvclass:new report subVI.vi ->NI_report.lvclass:New Report.vi -> Export Report With JKI.vi …

【数据库】Sql Server 2022通过临时表和游标遍历方式逻辑处理获取目标数据

2023年,第39周。给自己一个目标,然后坚持总会有收货,不信你试试! 今天有个小伙伴咨询一个Sql Server处理数据的问题,刚好重温下SqlServer临时表和游标的知识点 目录 一、需求点描述二、临时表2.1、局部临时表&#xff…

为什么曲面函数的偏导数可以表示其曲面的法向量?

为什么曲面函数的偏导数可以表示其曲面的法向量? 引用资料: 1.知乎shinbade:曲面的三个偏导数为什么能表示法向量? 2.Geogebra羅驥韡 (Pegasus Roe):偏導數、切平面、梯度 曲面 F ( x , y , z ) 0 F(x,y,z)0 F(x,y,…

vim,emacs,verilog-mode这几个到底是啥关系?

vim:不多说了被各类coder誉为地表最强最好用的编辑器;gvim,gui vim的意思; emacs:也是一个编辑器,类似vscode; vim在使用的时候为了增强其功能,有好多好多插件,都是以.…

爬虫 — Scrapy 框架(一)

目录 一、介绍1、同步与异步2、阻塞与非阻塞 二、工作流程三、项目结构1、安装2、项目文件夹2.1、方式一2.2、方式二 3、创建项目4、项目文件组成4.1、piders/__ init __.py4.2、spiders/demo.py4.3、__ init __.py4.4、items.py4.5、middlewares.py4.6、pipelines.py4.7、sett…

Vue的进阶使用--模板语法应用

目录 前言 一. Vue的基础语法 1.插值 1.1文本插值 1.2HTML插值 1.3属性插值 1.4Vue演示三元条件运算 2 指令 2.1if&&else指令(v-if/v-else-if/v-else) 2.2 v-for 指令 2.3 v-on指令(动态参数) 2.4知识点补充之v-if与v-show的区别 3.过…

基础练习 十进制转十六进制

问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是…

Webpack设置代码映射,可调试打包后的代码

当我们的代码打包过后再看源码就会变成下面这个样子: 这时候我们就调试不了我们的代码 解决方式: 在webpack.config.js中添加如下代码: module.exports {mode: "development", // 设置打包的模式:production生产模式…

看阿里测试工程师如何玩转postman+newman+jenkins接口自动化

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) postman用来做接口测试非常方便,接口较多时,则可以实现接口自动化 一、环境准备…

人工智能未来可期:超越人类能力的新科技

随着科技的飞速发展,人工智能(AI)已经逐渐成为我们生活、工作不可或缺的一部分。从智能语音助手到自动驾驶汽车,再到医疗诊断和金融投资,AI的应用越来越广泛。本文将探讨人工智能未来的发展趋势,以及可能超…

LeetCode99之恢复二叉搜索树(相关话题:中序遍历)

目录 题目描述 解题思路 递归写法 非递归写法 思路拓展 难点剖析

在 Vue 项目中添加字典翻译工具

背景 当我们在编写前端代码时,往往会对状态类的字段感到苦恼,因为他可能是0,1,2…,也可能是…,我们将他称之为:“字典(dict)”。它是多变的,而且后期可能会有…

gin框架再探

Gin框架介绍及使用 | 李文周的博客 (liwenzhou.com) lesson03_gin框架初识_哔哩哔哩_bilibili 1.路由引擎 //路由引擎 rgin.Default() 2.一些http请求方法 get post put delete等等 遇到什么路径,执行什么函数 r.GET("/hello",func{做你想做的事返回…

vue 如何加载组件

一&#xff0c;如何加载组件 第一步 引用组件 import MyComponent from ./components/MyComponent.vue; 第二部注入组件 export default{//注入组件components:{MyComponent}} 三 显示组件 <template><!-- 显示组件 --><MyComponent /> </template> 二…

iPhone15线下购买,苹果零售店前门店排长队

今年的苹果新品发布会于北京时间 9 月 13 日凌晨举行&#xff0c;并于 9 月 15 日&#xff08;周五&#xff09;开启订购&#xff0c;9 月 22 日&#xff08;周五&#xff09;起正式发售。 据多位网友反馈&#xff0c;首批苹果 iPhone15 系列手机、Apple Watch Ultra 2 / Seri…