19 视图定义 union 是根据第一个 select 字段列表顺序,来进行 merge 的

前言

这个问题主要是 在之前存在这样的一个问题, 在生产环境上面 

按照 我的直观理解, mysql 应该是根据 key 进行 merge, 所以 select 的顺序应该是 “不重要”??, 但是 结果我理解错了

然后 线上的查询也出现了问题, 发现很奇怪的问题, 明明 key01 列 是 id, 但是有一部分 key01 是 field1, 然后 进而 产生了业务上面的查询问题 

这里从 mysql 的查询开始回溯这里的整个流程 

select id as key01, field1 as key02 from tz_test

union

select field1 as key02, id as key01 from tz_test_02

 

测试表结构信息如下 

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

 

 

将数据从 rec 转换为 mysql_rec

这里的处理是将具体的 rec 中的给定的字段复制到 mysql_rec 中存储 

4f9cba1c226e4ebc87784a66e463cbd3.png

 

外层是遍历字段, 遍历完字段之后 需要的字段就已经转换到了 mysql_rec 中 

a7fdfa60db7944cfa6a4bba49ea1dcc7.png

 

mysql_rec 中的顺序和 select 中的顺序无关 

rec 的数据部分结构如下 

05d44d9249cf45aa8dd574243930d409.png

 

mysql_rec 的结构如下, prebuilt->mysql_template[i] 中存储的是响应的字段的元数据 

6b570bbe52c04acea275511ca76d22ea.png

 

 

将数据更新到 Field->ptr 中 

初始化 read_record 的地方 

这里初始化的 record 为 table->record[0]

再看 qeb_tab->fields 中的信息可以看到 ptr 已经设置好了, 可以推断出 ptr 是在之前就已经更新好了的, 这需要回溯到 table->record 的初始化相关 

9da64921c49b4508b04124be4399b63f.png

 

qup_tab 中的 fields, all_fields 初始化如下 JOIN.fields_list, all_fields

2bf9bc457cd14f08a458b250ab0624d9.png

join 的 fields_list 来自于 select_lex

75e3584a20f946018e86daeac2ee8aae.png

 

解析来源 sql 的时候从 sql 中解析出了 字段名称, 但是 尚未填充 TABLE, FIELD 等等相关结构 

1b3b48f79b304f369b843e9020d47a8b.png

select_lex 中的各个字段初始化如下, 主要是通过 find_field_in_tables 中查询的 

70fafea45da24803ac7dbefe699760d0.png

 

比如我们这里 tz_test 表, 字段的 lookup 是通过遍历字段 然后 比较字段名来确认的

其他的信息 我们不在赘述

1dd73ad6102b41a5806ab27db0c2bfd7.png

 

 

TABLE 的 record[0] 的初始化, 和相关的 Field 的初始化的流程了 

默认情况下 mysql 目标表的加载是懒加载的

然后这里从 frm 中读取相关的元数据, 加载到 服务的内存中

这里是创建各个 Field

6fdac05ed9254d54b4a474d873ffdf4a.png

 

然后给定的字段的 ptr 是初始化为 table->record[0] 加上一个字段偏移 

所以说字段布局已经在创建表 的时候已经确定好了

这就是为什么 上面服务器将数据从 rec 中转换到 mysql_rec 中 

然后后面基于 Item, Field 可以直接读取到给定的字段的值的原因了 

65683816d1ec4d1f9700b1c4fe102a0b.png

 

 

union表 的结果查询

union 这边是通过一个临时表来进行的数据查询 

子查询1 将查询结果 “写入” 临时表union

子查询2 将查询结果 “写入” 临时表union

然后 最终一起查询 临时表union, 然后再将相应的数据 响应给客户端

 

迭代具体的记录信息的地方如下 

7f225df830e14afdbe3899f4e8df6070.png

 

这里拷贝的 rec 记录信息如下, 这是 临时表 的 TABLE->record[0]

然后这里的存储方式是按照 mysql_rec 的方式来存储, 然后使用 Field_xxx::val_str 来读取给定的 buf 的数据, 然后之后通过  

b8b392685eb0472e8041802f69405212.png

 

临时表union 的 key01 字段如下, 可以看到 ptr 是在 TABLE->record[0] 的区间内 

af23e3254dcd417fb7ef5e6ad42c957c.png

 

临时表union 的 key02 字段如下, 可以看到 ptr 是在 TABLE->record[0] 的区间内 

decc55f7b7174fd290d9fb9c1e4e90ea.png

 

表中的数据通过 Field_varstring::val_str 来解析给定的 mysql_rec 的数据  

f76f8503b9464c708c66e70964384d3c.png

 

将待输出字符串输出到输出缓冲区, 这里记录了 长度 和 具体的字符信息 

这里待输出字符串为 “7777777”, 输出一个字节长度 07, 接着七个字节为 ‘7’

57ca22420c144d61a28f0aa628b420a0.png

 

输出缓冲区待写出数据如下, 一个字节长度 0x07, 七个字节字符信息 “0x32323232323232”

3b94bb87b4af48c0baa209636b760ccb.png

 

 

union表 的数据来源 

这是从 “select id as key01, field1 as key02 from tz_test” 查询出来的第一条记录 

然后 将其写出到 union表 

96819ec9baac4596856c9df328dddc82.png

 

tz_test 查询出来的第一条记录 {id : 1111111, field1 : 12 }

1353256196664fc79758ae19f7984a3a.png

 

将查询出来的第一条记录的 id 转换为 Field_str, 存储起来 

2375e7660e584900a3157dac065b21aa.png

将 TABLE->record[0] 的数据 “持久化” 起来, 这里是放到 ha_heap 的固定的空间  

92384090901f44639b16084e910ca266.png

 

tz_test_2 的查询结果做数据转换的时候, 可以看到的是 field1 存储到的是 key01 字段 

a038748e51504f32bf9d60169ebaf317.png

 

这个字段是顺序如下, key01, key02 是取自 union 的第一个查询, 根据这个字段列表创建的临时表 

然后 “select field1 as key02, id as key01 from tz_test_02” 的查询结果按照 列的顺序 分别保存到对应的列, 然后 后面 table->file->ha_file_write 写出到 union表 

219a15dc3db24b3a824ee30154c1bb31.png

 

 

union表 的创建

创建临时表的地方如下, 在 handle_query 的地方, 传入的 column_types 列表为 key01, key02

c3c3d932124c48ca944639b130f1397b.png

 

传入的 column_types 外部的初始化如下, 获取第一个查询 选择列 列表, 作为临时表的字段列表 

2cc6368d03574377b21ae3219fcadf33.png

 

在执行 join 之前, 创建了 结果的临时表

然后 后面查询迭代使用的字段列表, 都是使用的 这里创建的字段列表

21f0ebe4c70f4a53bd4cf83554cbf383.png

 

 

 完

 

 

 

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

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

相关文章

深度学习——线性神经网络一

深度学习——线性神经网络一 文章目录 前言一、线性回归1.1. 线性回归的基本元素1.1.1. 线性模型1.1.2. 损失函数1.1.3. 解析解1.1.4. 随机梯度下降1.1.5. 用模型进行预测 1.2. 向量化加速1.3. 正态分布与平方损失1.4. 从线性回归到深度网络 二、线性回归的从零开始实现2.1. 生…

Java面试题整理(带答案)

目录 TCP和UDP的区别 get和post的区别 Cookie和session的区别 Java的基本类型有哪些? 抽象类和接口区别? 对于堆栈的理解 和equals区别 如何理解Java多态? 创建线程都有哪些方式 脏读、不可重复度、幻读都是什么? Jav…

多线程详解(上)

文章目录 一、线程的概念1)线程是什么2)为甚要有线程(1)“并发编程”成为“刚需”(2)在并发编程中, 线程比进程更轻量. 3)线程和进程的区别 二、Thread的使用1)线程的创建继承Thread…

算法通关村-----链表中环的问题

环形链表 问题描述 给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中…

使用Scrapy构建高效的网络爬虫

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 Scrapy是一个强大的Pyth…

python虚拟环境(venv)

一、什么是python环境 首先要知道什么是python环境? Python环境主要包括以下内容: 解释器 python.exe (python interpreter,使用的哪个解释看环境配置) Lib目录 标准库 第三方库:site-pakages目录,默认安装第三方…

基于DSPACE功率平衡理论的并联有源电力滤波器模型(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

webpack配置alias后eslint和ts无法识别

背景 我们在 webpack 配置 alias 后,发现项目中引入的时候,还是会报错,如下: 可以看到,有一个是 ts报错,还有一个是 eslint 报错。 解决 ts 报错 tsconfig.json {"compilerOptions": {...&q…

【力扣每日一题】2023.9.18 打家劫舍Ⅲ

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 今天是打家劫舍3,明天估计就是打家劫舍4了。 今天的打家劫舍不太一样,改成二叉树了,不过规则没有变&…

狗dog 数据集VOC-5912张

狗,是食肉目犬科犬属 哺乳动物 ,别称犬,与马、牛、羊、猪、鸡并称“六畜” 。狗的体型大小、毛色因品种不同而不同,体格匀称;鼻吻部较长;眼呈卵圆形;两耳或竖或垂;四肢矫健&#xff…

网站降权的康复办法(详解百度SEO数据分析)

随着搜索引擎算法的不断升级,很多网站在SEO优化过程中遭遇到降权的情况。如果您的网站也遭遇到了类似的问题,不必惊慌失措。本文将为您详细介绍网站降权恢复的方法,包括百度SEO数据分析、网站收录少的5个原因、网站被降权的6个因素以及百度SE…

IP风险查询:抵御DDoS攻击和CC攻击的关键一步

随着互联网的普及,网络攻击变得越来越普遍和复杂,对企业和个人的网络安全构成了重大威胁。其中,DDoS(分布式拒绝服务)攻击和CC(网络连接)攻击是两种常见且具有破坏性的攻击类型,它们…

js写一个判断字符串是否能够转为JSON 的函数

其实非常简单 这里我们需要涉及到 捕获异常 因为如果你直接在if里面转 我已经试过了 直接就报错了 一点面子不给 我们写一个这样的函数 function isJsonString(str) {try {JSON.parse(str);return true;} catch (e) {return false;} }编写如下代码 console.log(isJsonString(…

企业架构LNMP学习笔记58

开始学习Tomcat: 学习目标和内容: 1)能够描述Tomcat的使用场景; 2)能够简单描述Tomcat的工作原理; 3)能够实现部署安装Tomcat; 4)能够实现和配置Tomcat的Server服务…

VMware虚拟机如何设置网络

一直没弄明白怎么能让虚拟机正常上网和访问,最近总结一个小经验 要在宿主机访问虚拟机电脑服务器,要设置成nat格式,虚拟机可以上网,宿主机访问虚拟机上的ip即可访问虚拟机里的服务器,也就是这样设置就行。 这时候ip不…

blender怎么设置中文界面

你们知道Blender软件是什么吗?你知道blender怎么设置中文界面吗?Blender是个GNU的3D绘图软件,建模、算图、动画等功能都相当的完整,可以说已经具有了一般商业软件的规模。Blender大部分的功能都有热键,操作起来相当地轻…

实现安全的服务通信:探索如何使用服务网格来确保服务间的安全通信

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

22.2 JavaScript 常用操作

1. BOM操作 浏览器对象模型(BOM): 是JavaScript与浏览器交互的接口集合. 它提供了一组对象, 用于操作浏览器窗口, 历史记录, 文档等. BOM可以通过Javascript代码来访问和控制浏览器的功能和行为.BOM的核心对象是window对象, 它表示浏览器的窗口或框架. 通过window对象, 可以访…

Matlab图像处理-强度分层法

强度分层法 强度分层技术是最简单的伪彩色图像处理方法之一。 如果将一幅图像被描述为空间坐标(x,y) 的强度函数f(x,y) ,则分层的方法可以看作是将一些平面平行于图像坐标平面(x,y) ,然后将每个平面在相交区域切割图像函数。下图展示了使用平面将图像函…

【基础篇】六、基于SpringBoot来整合SSM的案例(下)

文章目录 1、前后端调用:axios发送异步请求2、添加功能3、删除功能4、修改功能5、异常消息处理6、分页功能7、分页Bug处理8、条件查询 接下来加入前端页面,使用axios发送异步请求调用上篇的接口。调前端代码时,发现还挺有趣,刷新、…