当前位置: 首页 > news >正文

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

 

然后测试数据如下 

975566306622420d98cc68cc58d323e6.png

 

 

 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’ ”

b04f65871c884761b56505e69315499a.png

 

然后我们来看一下 迭代这多个 range 查询的地方 

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

c998cce0fd444c058dafad78d031dc5f.png

 

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

9cefce313bfb49e5a266f72144945d8a.png

 

总共执行的 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 查询 

ca94fcf264cb4bfe952fc397786b4b36.png

 

 

in 的全表扫描 

执行 sql 如下 “select * from tz_test where field1 in ("field9", "field5");”

 

explain 如下, 可以看到的是 进行了 全表扫描

b1dde2d77a8946eb8c4eebaf55e11a63.png

 

在 row_search_mvcc 中没有做条件过滤限制 

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

ea82fe1ea12646b398e68f9aac8bd7ef.png

 

然后外层 evaluate_join_record 中来判断条件是否成立, 如果不成立 更新统计信息

如果成立, 输出当前记录 选择的相关列

b3d54cb424d74245831d29d25e6b3250.png

 

 

什么时候拆分 range, 什么时候 不拆分? 

这里仅仅是 整理一个 模糊的规律, 因为 全表扫描的开销 取决于很多情况

 

执行sql 如下 “explain select * from tz_test where field1 in ("field1", "field5");”

可以看到 全表扫描 的开销大概是在 5 左右 

field1 索引扫描开销是 4, 大致的计算方式为扫描的记录的数量, 比如 ”field1”, ”field5” 需要扫描 “field1”, “field2”, “field5”, “field6,field5”

这里 field1 索引扫描开销较小, 因此选择的是 索引扫描

24ccf65a016048ee844198600656a911.png

 

执行sql 如下 “explain select * from tz_test where field1 in ("field9", "field5");”

可以看到 全表扫描 的开销大概是在 5 左右 

field1 索引扫描开销是 5, 大致的计算方式为扫描的记录的数量, 比如 ”field9”, ”field5” 需要扫描 “field5”, “field6,field5”, “field9”, “field9”, “supremum”

这里 全表索引扫描开销较小, 因此选择的是 全表扫描

e750426bc6234610a3f750d1e94f2854.png

 

执行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”

这里 全表索引扫描开销较小, 因此选择的是 全表扫描

cd8ce8597d864491bd76c582ae0b5129.png

 

 

 

 

 

相关文章:

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添加自定义注释

在写代码的时候我们为了规范化&#xff0c;一般会加文件注释、类注释和函数注释&#xff1b;用注释来说明我们的代码&#xff0c;也方便模块化开发&#xff0c;那么我们在写注释的时候经常会写一些重复的内容&#xff0c;我们会复制粘贴。这样一来二去&#xff0c;就显得很繁琐…...

docker 各种命令

-v 或 --volume 由三个由冒号&#xff08;:&#xff09;分隔的字段组成&#xff0c;[HOST-DIR:]CONTAINER-DIR[:OPTIONS]。 HOST-DIR 代表主机上的目录或数据卷的名字。省略该部分时&#xff0c;会自动创建一个匿名卷。如果是指定主机上的目录&#xff0c;需要使用绝对路径。 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控制器&#xff1a;概念、原理解读 DaemonSet概述DaemonSet工作原理&#xff1a;如何管理PodDaemonset典型的应用场景DaemonSet 与 Deployment 的区别DaemonSet资源清单文件编写技巧 DaemonSet使用案例&#xff1a;部署日志收集组件fluentdDaemonset管理pod&#xff1…...

您对互联网有多“上瘾”?

萨里大学的科学家决定检查现代用户的网络成瘾程度。他们的一篇文章最近发表在 《旅行与旅游营销杂志》上 &#xff0c;其中包含对受此问题困扰的年轻人&#xff08;而不仅仅是年轻人&#xff09;的研究和分类结果。 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是一个时间片轮询框架&#xff0c;完全解耦的时间片轮询框架&#xff0c;非常适合裸机单片机引用。接下来将该框架移植到stm32单片机运行&#xff0c;单片机…...

C++ 程序员入门需要多久,怎样才能学好?

我们都知道&#xff0c;C是所有语言的基础 &#xff01;记得在大学毕业之后&#xff0c;做了C的后端开发当然还有一些嵌入式的相关的工作&#xff0c;到现在换工作&#xff0c;工作机会依然那么多&#xff0c;到了一定的阶段&#xff0c;我想你不是在找工作&#xff0c;而是工作…...

SpringBoot项目打war包部署到tomcat访问路径去掉项目名

方法一&#xff1a;手动修改包名 1.先将Tomcat webapp目录下文件全部删除 2.将war包文件放在webapps文件夹下 2.运行tomcat&#xff0c;war文件自动解压成文件夹 3.关闭tomcat&#xff0c;&#xff0c;将步骤2解压的文件夹直接改名为ROOT 4.重新运行tomcat&#xff0c;即可。 5…...

58同城面试

一、Java八股 1、ThreadLocal的底层原理是什么&#xff1f; ThreadLocal 在Java中用于提供线程局部变量&#xff0c;这些变量在每个线程中都有独立的副本&#xff0c;互不干扰。其底层原理可以简要描述如下&#xff1a; 数据存储: 每个线程中都有一个 ThreadLocalMap 的实例&…...

【数据结构】归并排序 的递归实现与非递归实现

归并排序 前言一、归并排序递归实现&#xff08;1&#xff09;归并排序的核心思路&#xff08;2&#xff09;归并排序实现的核心步骤&#xff08;3&#xff09;归并排序码源详解&#xff08;4&#xff09;归并排序效率分析1&#xff09;时间复杂度 O&#xff08;N*logN&#xf…...

Go的命令行工具开发:使用Cobra库

今天我们将深入探讨如何使用Go语言和Cobra库来开发命令行工具。 命令行工具在软件开发中有着广泛的应用&#xff0c;它们快速、高效&#xff0c;且易于自动化。 Go语言因其简洁、高效而被广泛用于命令行工具的开发。Cobra库则是Go中用于构建命令行工具的重要库之一。 为什么选…...

坚持#第420天~阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法

阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法&#xff0c;亲测有效&#xff1a; Mobax好卡啊&#xff0c;那就直接在阿里云后台操作即可&#xff0c;阿里云后台也可以上传文件。 Navicat mysql好卡啊&#xff0c;那就直接在阿里云后台最上面帮助的右边有个数据库&…...

时间序列聚类的直观方法

一、介绍 我们将使用轮廓分数和一些距离度量来执行时间序列聚类实验&#xff0c;同时利用直观的可视化&#xff0c;让我们看看下面的时间序列&#xff1a; 这些可以被视为具有正弦、余弦、方波和锯齿波的四种不同的周期性时间序列 如果我们添加随机噪声和距原点的距离来沿 y 轴…...

vue3的reactive源码解析

reactive源码解析 总结一句: reactive是个函数。reactive函数返回了一个createReactiveObject函数&#xff0c;createReactiveObject又返回了一个“经new Proxy实例化”的对象。 详细介绍: 我们使用时传给reactive函数一个对象类型target&#xff0c;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)个指示灯&#xff0c;灯大小一样&#xff0c;任意两个之间无重叠。由于AI识别误差&#xff0c;每次识别到的指示灯位置可能有差异&#xff0c;以4个坐标值描述Al识别的指示灯的大小和位置(左上角x1,y1&#xff0c;右下角x2.y2)。请输出先行…...

[概述] 点云滤波器

拓扑结构 点云是一种三维数据&#xff0c;有几种方法可以描述其空间结构&#xff0c;以利于展开搜索 https://blog.csdn.net/weixin_45824067/article/details/131317939 KD树 头文件&#xff1a;pcl/kdtree/kdtree_flann.h 函数&#xff1a;pcl::KdTreeFLANN 作用&#xff1a…...

深度解析:三合一技术方案破解Cursor AI编辑器限制的终极指南

深度解析&#xff1a;三合一技术方案破解Cursor AI编辑器限制的终极指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached yo…...

从平面到立体:用ImageToSTL将照片变为可触摸的3D模型

从平面到立体&#xff1a;用ImageToSTL将照片变为可触摸的3D模型 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from the left side. …...

Gemini Nano离线推理部署手册(移动端LLM轻量化部署终极版)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Gemini Nano离线推理部署手册&#xff08;移动端LLM轻量化部署终极版&#xff09; Gemini Nano 是 Google 推出的首个专为端侧设备设计的轻量级大语言模型&#xff0c;支持在 Android 14 设备上本地运行&…...

折叠表达式:左折叠,右折叠

关于何为左右折叠表达式可以直接通过 C Insights (C Insights) 来进行查看原理。左折叠template <typename... Args> auto getSum(Args... args) {return (args ...); }int main() {getSum(1, 2, 3, 4, 5); } template <typename... Args> auto getSum(Args... ar…...

【免费下载】 MobaXterm 汉化版资源文件下载

MobaXterm 汉化版资源文件下载 资源文件介绍 文件名: MobaXterm_CHS.zip 文件类型: 压缩包 文件描述: 该资源文件为 MobaXterm 的汉化版本&#xff0c;提供了增强型终端、X 服务器和 Unix 命令集&#xff08;GNU/Cygwin&#xff09;工具箱的功能。 MobaXterm 简介 MobaXterm 又…...

DS18B20单总线温度传感器在CircuitPython中的实战应用指南

1. 项目概述与单总线协议的价值如果你正在用像Adafruit Feather M0 Express或Raspberry Pi Pico这类小巧的板子做项目&#xff0c;需要测量温度&#xff0c;DS18B20绝对是一个绕不开的经典选择。我这些年做过不少环境监测、智能家居的小玩意儿&#xff0c;从鱼缸水温到3D打印机…...

如何快速清理Mac残留文件:免费开源工具终极指南

如何快速清理Mac残留文件&#xff1a;免费开源工具终极指南 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经遇到过这样的困扰&#xff1f;明明已经…...

内网手机远程桌面:解锁高效协同的数字密钥

在数字化办公与生活深度融合的当下&#xff0c;人们对于信息获取与设备操控的便捷性需求持续攀升。当我们身处内网环境&#xff0c;却渴望随时随地操控远端的电脑设备&#xff0c;内网手机远程桌面技术便如同一把精准的数字密钥&#xff0c;打破空间与网络的束缚&#xff0c;为…...

2026年DevSecOps工具选型推荐:如何构建安全高效的研运体系

在2026年&#xff0c;软件交付的速度与质量安全已成为企业核心竞争力的关键。DevSecOps作为将安全能力左移并贯穿软件开发生命周期&#xff08;SDLC&#xff09;的实践方法论&#xff0c;其成功落地高度依赖于一套功能强大、易于集成且团队愿意采纳的工具链。面对市场上纷繁复杂…...

终极Elsevier审稿追踪指南:5分钟实现智能投稿监控的完整方案

终极Elsevier审稿追踪指南&#xff1a;5分钟实现智能投稿监控的完整方案 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在为Elsevier期刊投稿后的漫长等待而焦虑吗&#xff1f;每天反复登录系统查看审稿进度&…...