32 mysql in 的实现

news/2024/10/24 9:16:56/

前言

这里我们主要是来探讨一下 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

 

 

 

 

 


http://www.ppmy.cn/news/1194632.html

相关文章

vue 获取上一周和获取下一周的日期时间

效果图&#xff1a; 代码&#xff1a; <template><div><div style"padding: 20px 0;"><div style"margin-left: 10px; border-left: 5px solid #0079fe; font-size: 22px; font-weight: 600; padding-left: 10px">工作计划</…

供应商等级:一级、二级和三级供应商之间有什么区别

作为一名专业采购人员&#xff0c;你知道拥有一个可靠且具有成本效益的供应链有多么重要。确保供应链顺利运行的方法之一就是利用供应商分级。 什么是供应商分级&#xff1f; 供应商分级是根据供应商的绩效和对企业的重要性&#xff0c;对其进行分类的做法。 因此&#xff0c…

一个使用uniapp+vue3+ts+pinia+uview-plus开发小程序的基础模板

uniappuviewPlusvue3tspiniavite 开发基础模板 使用 uniapp vue3 ts pinia vite 开发基础模板&#xff0c;拿来即可使用&#xff0c;不要删除 yarn.lock 文件&#xff0c;否则会启动报错&#xff0c;这个可能和 pinia 的版本有关&#xff0c;所以不要随意修改。 拉取代码…

软件测试之BUG篇(定义,创建,等级,生命周期)

目录 1. BUG 的定义 2. 如何创建 BUG 3. BUG 等级 4. BUG 生命周期 高频面试题&#xff1a; 1. BUG 的定义 当且仅当产品规格书存在且正确时&#xff0c;程序的实现和规格书的要求不匹配时&#xff0c;那就是软件错误。当产品规格说明书没有提到的功能时&#xff0c;以用户…

有关MySQL中的索引

MySQL中的索引是一种用于提高查询性能的数据结构。索引允许数据库引擎更快地定位和访问数据&#xff0c;减少了数据扫描的开销。下面是关于如何在 MySQL 中使用索引的一些重要信息和最佳实践&#xff1a; 创建索引&#xff1a; 在创建表时定义索引&#xff1a;可以在创建表的时…

代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零 文章链接&#xff1a;最后一块石头的重量 II 目标和 一和零 视频链接&#xff1a;最后一块石头的重量 II 目标和 一和零 1. LeetCode 1049. 最后一块石头的重量 II 1.1 思路…

Linux 编译链接那些事儿(02)C++链接库std::__cxx11::basic_string和std::__1::basic_string链接问题总结

1 问题背景说明 在自己的项目源码中引用libeasysqlite.so时编译成功&#xff0c;但运行时遇到问题直接报错&#xff0c;找不到符号 symbol&#xff1a;_ZN3sql5FieldC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_10field_typeEi。 2 问题描述和解…

【广州华锐互动】风景区规划VR虚拟现实教学系统

风景区规划VR虚拟现实教学系统是一种新兴的教学工具&#xff0c;它可以通过虚拟现实技术&#xff0c;为学生提供一种沉浸式的、实时的、全方位的景区规划体验。 在风景区规划VR虚拟现实教学系统中&#xff0c;学生可以通过虚拟现实技术&#xff0c;实时地与景区进行交互。他们可…