41 mysql subquery 的实现

2024-06-10 18:44

本文主要是介绍41 mysql subquery 的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

sub query 是一个我们经常会使用到的一个 用法

我们这里 看一看各个场景下面的 sub query 的相关处理 

查看 本文, 需要 先看一下 join 的相关处理 

测试数据表如下, 两张测试表, tz_test, tz_test03, 表结构 一致

CREATE TABLE `tz_test` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`field1` varchar(128) DEFAULT NULL,`field2` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `field_1_2` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8CREATE TABLE `tz_test_03` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`field1` varchar(128) DEFAULT NULL,`field2` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `field_1_2` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8

tz_test 数据如下 

tz_test_03 数据如下 

依据主键进行子查询 

执行 sql 如下 “select * from tz_test where id in (select id from tz_test_03);”

这里的实现 类似于 join 的根据主键进行关联的查询处理一样 

选择的主驱动表 为内层查询的数据表, 迭代内层的 id 列表 

内层的遍历基于待查询的主表 tz_test, 主要的查询条件是基于 正在遍历的 id 进行主键查询 

因为这里是主键关联, 因此只会 查询一次

内层迭代 tz_test 相关的函数如下, 只有一个根据 主键 进行查询, 下一个循环 会直接跳出循环

查询类似于如下 join 查询 

select t1.* from tz_test as t1 
inner join tz_test_03 as t2 on t1.id = t2.id 
where 1 = 1;

依据 索引字段 进行子查询

执行 sql 如下 “select * from tz_test where field1 in (select field1 from tz_test_03);”

这里的实现 和 join 就有区别了, 这里是 将内层查询处理成为了一个子查询, 新建了一张 临时表

外层迭代的数据如下, 是 tz_test 表 

内层循环迭代的是 mysql 生成的一张临时表 “<su bquery2>”, 这张表存在于 内存, 并且根据 数据特征做出了一些优化

比如我们这里 tz_test_03 表的 field1 字段, 其实仅仅只有 NORMAL 索引, 没有唯一限定, 但是 实际上在这里 从 qep_tab->read_first_record 和 info->read_record 可以看出, mysql 根据 数据特征 增加了一个 “唯一限定”, 对于这里的场景中 field1 是唯一的 

最多只在 <subquery2> 中查询一次, 因此 说这里 mysql 在这 <subquery2> 的临时表的 field1 字段增加了一个 “唯一限定”

然后 <subquery2> 中的查询如下, 这里是存储的结构是一个 HashMap, 这里按照 HashMap 的查询方式进行查询, 比如这里查询的 key 是 “field12”

<subquery2> 是根据 tz_test_03, 因此记录有 7 条

对于 tz_test 中有, <subquery2> 中不存在的记录, 这里 内层循环 查询不到, 响应 -1, 跳出循环 

<subquery2> 临时表的数据填充 

这里有三个 sub_query, 最顶层的是 tz_test, 第二层的是 <subquery2>, 最底层的是 tz_test_03

<subquery2> 的表数据类似于 “select field1 from tz_test_03;”

<subquery2> 的临时初始化 是在 qup_tab->prepare_scan 中处理的 

然后 之后是将记录 持久化到 share->records 中

依据 普通字段 进行子查询 

执行 sql 如下 “select * from tz_test where field2 in (select field2 from tz_test_03);”

这里的处理 和 依据普通字段进行 join 查询的处理一样, 首先是将 tz_test_03 的相关字段放到 join_buffer, 因此这里 join_buffer 中有 7 条记录 

然后 这里迭代 tz_test 的数据, 然后 输出符合条件的记录 输出

do_select 这一层情况如下 

查询类似于如下 join 查询 

select t1.* from tz_test as t1 
inner join tz_test_03 as t2 on t1.field2 = t2.field2 
where 1 = 1;

大批量的数据依据主键进行子查询是否有优化?

构造 大表如下

执行 sql 如下 “select *, 2, 2, 2 from tz_test where id in (select id from tz_test_03);”

可以看到的是 查询实现是一样的, 主驱动表为的 tz_test_03, 然后 内层循环表为 tz_test

这篇关于41 mysql subquery 的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048967

相关文章

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2