32 mysql in 的实现
前言
这里我们主要是来探讨一下 mysql 中 in 的使用, find_in_set 的使用
这两者 在我们实际应用中应该也是 非常常用的了
测试数据表如下
CREATE TABLE `tz_test` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`field1` varchar(16) DEFAULT NULL,`field2` varchar(16) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,KEY `field1` (`field1`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
然后测试数据如下

将 in 拆分为多个 range 查询
执行 sql 如下 “select * from tz_test where field1 in ("field1", "field5");”
explain 如下, 然后 这个查询会将 sql 拆分为 类似于如下效果
“select * from tz_test where field1 > =‘field1’ and field1 <= ‘field1’ ” + “select * from tz_test where field1 > =‘field5’ and field1 <= ‘field5’ ”

然后我们来看一下 迭代这多个 range 查询的地方
第一个 range 区间如下 实现类似于 “select * from tz_test where field1 > =‘field1’ and field1 <= ‘field1’”

第二个 range 区间如下 实现类似于 “select * from tz_test where field1 > =‘field5’ and field1 <= ‘field5’”

总共执行的 row_search_mvcc 的查询如下
其中, 第二个 ”field2” 和 第二个 ”field6” 的查询是在 do..while 中 read_range_next 中去查询的
第一个 field1 和 field2 是在 “select * from tz_test where field1 > =‘field1’ and field1 <= ‘field1’” range 查询中
第一个 field5 和 field6 是在 “select * from tz_test where field1 > =‘field5’ and field1 <= ‘field5’” range 查询中
至于 range 的查询流程, 这里就不多 赘述了, 可以参考前面 mysql range 查询

in 的全表扫描
执行 sql 如下 “select * from tz_test where field1 in ("field9", "field5");”
explain 如下, 可以看到的是 进行了 全表扫描

在 row_search_mvcc 中没有做条件过滤限制
in 的条件限制是在外面 Item_func_in 中进行处理的, 来判断当前 字段 是否在目标 列表中

然后外层 evaluate_join_record 中来判断条件是否成立, 如果不成立 更新统计信息
如果成立, 输出当前记录 选择的相关列

什么时候拆分 range, 什么时候 不拆分?
这里仅仅是 整理一个 模糊的规律, 因为 全表扫描的开销 取决于很多情况
执行sql 如下 “explain select * from tz_test where field1 in ("field1", "field5");”
可以看到 全表扫描 的开销大概是在 5 左右
field1 索引扫描开销是 4, 大致的计算方式为扫描的记录的数量, 比如 ”field1”, ”field5” 需要扫描 “field1”, “field2”, “field5”, “field6,field5”
这里 field1 索引扫描开销较小, 因此选择的是 索引扫描

执行sql 如下 “explain select * from tz_test where field1 in ("field9", "field5");”
可以看到 全表扫描 的开销大概是在 5 左右
field1 索引扫描开销是 5, 大致的计算方式为扫描的记录的数量, 比如 ”field9”, ”field5” 需要扫描 “field5”, “field6,field5”, “field9”, “field9”, “supremum”
这里 全表索引扫描开销较小, 因此选择的是 全表扫描

执行sql 如下 “explain select * from tz_test where field1 in ("field1", "field2", "field3");”
可以看到 全表扫描 的开销大概是在 5 左右
field1 索引扫描开销是 6, 大致的计算方式为扫描的记录的数量, 比如 ”field1”, ”field2”, “feidl3” 需要扫描 “field1”, “field2”, “field2”, “field3”, “field3”, “field4,field5”
这里 全表索引扫描开销较小, 因此选择的是 全表扫描

完
相关文章:
32 mysql in 的实现
前言 这里我们主要是来探讨一下 mysql 中 in 的使用, find_in_set 的使用 这两者 在我们实际应用中应该也是 非常常用的了 测试数据表如下 CREATE TABLE tz_test (id int(11) unsigned NOT NULL AUTO_INCREMENT,field1 varchar(16) DEFAULT NULL,field2 varchar(16) DEFAU…...
Qt QtCreator添加自定义注释
在写代码的时候我们为了规范化,一般会加文件注释、类注释和函数注释;用注释来说明我们的代码,也方便模块化开发,那么我们在写注释的时候经常会写一些重复的内容,我们会复制粘贴。这样一来二去,就显得很繁琐…...
docker 各种命令
-v 或 --volume 由三个由冒号(:)分隔的字段组成,[HOST-DIR:]CONTAINER-DIR[:OPTIONS]。 HOST-DIR 代表主机上的目录或数据卷的名字。省略该部分时,会自动创建一个匿名卷。如果是指定主机上的目录,需要使用绝对路径。 C…...
【优选算法系列】【专题五位运算】第一节.常见的位运算(面试题 01.01. 判定字符是否唯一和268. 丢失的数字)
文章目录 前言常见的位运算一、判定字符是否唯一 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、丢失的数字 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 常见的…...
学习笔记二十八:K8S控制器Daemonset入门到企业实战应用
DaemonSet控制器:概念、原理解读 DaemonSet概述DaemonSet工作原理:如何管理PodDaemonset典型的应用场景DaemonSet 与 Deployment 的区别DaemonSet资源清单文件编写技巧 DaemonSet使用案例:部署日志收集组件fluentdDaemonset管理pod࿱…...
您对互联网有多“上瘾”?
萨里大学的科学家决定检查现代用户的网络成瘾程度。他们的一篇文章最近发表在 《旅行与旅游营销杂志》上 ,其中包含对受此问题困扰的年轻人(而不仅仅是年轻人)的研究和分类结果。 796名不同年龄段的人参加了实验。科学家们仔细监测了他们的行…...
数据挖掘题目:设ε= 2倍的格网间距,MinPts = 6, 采用基于1-范数距离的DBSCAN算法对下图中的实心格网点进行聚类,并给出聚类结果(代码解答)
问题 代码 import matplotlib.pyplot as plt import numpy as np from sklearn.cluster import DBSCAN #pip install matplotlib #pip install numpy #pip install scikit-learn # 实心格网点的坐标 solid_points np.array([[1, 1], [2, 1],[3, 1], [1, 2], [2, 2], [3, 2],[…...
STM32HAL-完全解耦面向对象思维的架构-时间轮片法使用(timeslice)
目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、代码解释 六、总结 概述 timeslice是一个时间片轮询框架,完全解耦的时间片轮询框架,非常适合裸机单片机引用。接下来将该框架移植到stm32单片机运行,单片机…...
C++ 程序员入门需要多久,怎样才能学好?
我们都知道,C是所有语言的基础 !记得在大学毕业之后,做了C的后端开发当然还有一些嵌入式的相关的工作,到现在换工作,工作机会依然那么多,到了一定的阶段,我想你不是在找工作,而是工作…...
SpringBoot项目打war包部署到tomcat访问路径去掉项目名
方法一:手动修改包名 1.先将Tomcat webapp目录下文件全部删除 2.将war包文件放在webapps文件夹下 2.运行tomcat,war文件自动解压成文件夹 3.关闭tomcat,,将步骤2解压的文件夹直接改名为ROOT 4.重新运行tomcat,即可。 5…...
58同城面试
一、Java八股 1、ThreadLocal的底层原理是什么? ThreadLocal 在Java中用于提供线程局部变量,这些变量在每个线程中都有独立的副本,互不干扰。其底层原理可以简要描述如下: 数据存储: 每个线程中都有一个 ThreadLocalMap 的实例&…...
【数据结构】归并排序 的递归实现与非递归实现
归并排序 前言一、归并排序递归实现(1)归并排序的核心思路(2)归并排序实现的核心步骤(3)归并排序码源详解(4)归并排序效率分析1)时间复杂度 O(N*logN…...
Go的命令行工具开发:使用Cobra库
今天我们将深入探讨如何使用Go语言和Cobra库来开发命令行工具。 命令行工具在软件开发中有着广泛的应用,它们快速、高效,且易于自动化。 Go语言因其简洁、高效而被广泛用于命令行工具的开发。Cobra库则是Go中用于构建命令行工具的重要库之一。 为什么选…...
坚持#第420天~阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法
阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法,亲测有效: Mobax好卡啊,那就直接在阿里云后台操作即可,阿里云后台也可以上传文件。 Navicat mysql好卡啊,那就直接在阿里云后台最上面帮助的右边有个数据库&…...
时间序列聚类的直观方法
一、介绍 我们将使用轮廓分数和一些距离度量来执行时间序列聚类实验,同时利用直观的可视化,让我们看看下面的时间序列: 这些可以被视为具有正弦、余弦、方波和锯齿波的四种不同的周期性时间序列 如果我们添加随机噪声和距原点的距离来沿 y 轴…...
vue3的reactive源码解析
reactive源码解析 总结一句: reactive是个函数。reactive函数返回了一个createReactiveObject函数,createReactiveObject又返回了一个“经new Proxy实例化”的对象。 详细介绍: 我们使用时传给reactive函数一个对象类型target,reactive又将target传给cr…...
【ElasticSearch系列-04】ElasticSearch的聚合查询操作
ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【三】ElasticSearch的高级查询Quer…...
Redisson初始
最近的自己,一直都在做些老年的技术,没有啥升级,自己也快麻木了,自己该怎么说,那必须行动起来啊!~来来,我们一起增长自己的内功 分布式锁的最强实现: Redisson 1.概念 在介绍之前,我们要知道这个Redisson是啥? 难道就是Redis的son?(我第一次就这么认为的哈哈!) 事实也的确如…...
【华为OD题库-018】AI面板识别-Java
题目 Al识别到面板上有N(1<N≤100)个指示灯,灯大小一样,任意两个之间无重叠。由于AI识别误差,每次识别到的指示灯位置可能有差异,以4个坐标值描述Al识别的指示灯的大小和位置(左上角x1,y1,右下角x2.y2)。请输出先行…...
[概述] 点云滤波器
拓扑结构 点云是一种三维数据,有几种方法可以描述其空间结构,以利于展开搜索 https://blog.csdn.net/weixin_45824067/article/details/131317939 KD树 头文件:pcl/kdtree/kdtree_flann.h 函数:pcl::KdTreeFLANN 作用:…...
Git-RSCLIP快速部署指南:一键启动,轻松搭建你的遥感图像搜索引擎
Git-RSCLIP快速部署指南:一键启动,轻松搭建你的遥感图像搜索引擎 1. 引言:遥感图像搜索的新利器 在遥感图像分析领域,我们经常面临这样的挑战:如何从海量卫星和航拍图像中快速找到特定目标?传统方法需要人…...
第20篇:扩展卡尔曼滤波器实战精讲
本篇前置知识:掌握基础线性代数、了解状态空间方程、会基础Python编程、熟悉标准卡尔曼滤波原理、接触过工控闭环数据采集。 零基础小白也能跟着吃透,全程避开晦涩纯数学推导,所有知识点绑定机器人、自动驾驶、工控实测场景,代码直…...
Seurat实战:如何用FindMarkers函数精准鉴定单细胞亚群(附避坑指南)
Seurat实战:用FindMarkers函数精准鉴定单细胞亚群的7个关键策略 单细胞RNA测序技术正在彻底改变我们对复杂组织的理解能力。在肌肉组织、肿瘤微环境或大脑皮层等高度异质性的样本中,准确识别和注释细胞亚群是每个研究者面临的重大挑战。Seurat工具包中的…...
别再乱装JDK了!Win11下用Eclipse Temurin OpenJDK 17的正确姿势(附路径避坑指南)
Win11开发者必看:Eclipse Temurin OpenJDK 17终极配置指南 刚接触Java开发的工程师小张最近遇到件怪事——明明按照教程安装了JDK,运行项目时却总是报错"找不到主类"。折腾两天后才发现,问题出在安装路径里的一个中文字符。这种看…...
Phi-3 Forest Laboratory 学术辅助:基于LaTeX的论文写作与公式编辑
Phi-3 Forest Laboratory 学术辅助:基于LaTeX的论文写作与公式编辑 写论文,尤其是理工科的论文,对很多学生和研究人员来说,是个既费时又费力的活儿。光是“相关工作”部分,就得翻遍文献,总结归纳ÿ…...
Qt图形视图框架性能调优指南:从QGraphicsScene的ItemIndexMethod到视图更新策略
Qt图形视图框架性能调优实战:从索引算法到渲染优化 在开发CAD设计工具或地理信息系统时,我们团队曾遇到一个棘手问题:当场景中的图元数量超过5000个时,平移视图会出现明显的卡顿。通过系统性的性能分析,我们发现90%的C…...
华为S5700交换机Combo口配置踩坑实录:从光口不亮到链路闪断,我的排错全记录
华为S5700交换机Combo口故障排查手记:一位工程师的深夜排错实录 凌晨2:15,监控系统刺耳的告警声把我从半梦半醒中彻底拽了出来。核心交换机与接入层之间的GigabitEthernet 1/0/5接口状态像霓虹灯一样在UP/DOWN之间疯狂切换——这已经是本周第三次了。作为…...
Qwen3-TTS声音克隆部署全攻略:简单3步,开启你的语音克隆之旅
Qwen3-TTS声音克隆部署全攻略:简单3步,开启你的语音克隆之旅 想不想让一段普通的文字,用你指定的声音说出来?比如,用你自己的声音给视频配音,用朋友的声音讲个笑话,或者用某个角色的声音朗读一…...
KV STUDIO Ver.12 梯形图编程实战:从入门到精通的5个关键步骤
1. 环境配置:从零搭建KV STUDIO开发环境 第一次打开KV STUDIO Ver.12时,很多新手会被复杂的界面吓到。其实只要按照正确步骤配置,半小时就能搭建好开发环境。我去年给产线做自动化改造时,需要在三台不同型号的KV PLC上部署程序&a…...
电商数据仓库实战:从概念模型到物理模型的完整设计流程(含PostgreSQL示例)
电商数据仓库实战:从概念模型到物理模型的完整设计流程(含PostgreSQL示例) 在电商行业,数据已成为驱动业务增长的核心引擎。一个设计精良的数据仓库能够将分散的交易记录、用户行为和商品信息转化为可操作的商业洞察。本文将带您深…...
