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

news2024/11/18 23:45:33

前言

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

按照 我的直观理解, 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.coloradmin.cn/o/1011573.html

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

相关文章

【Linux问题】This account is currently not available.

在切换mysql用户时候出现下面问题 Last login: Fri Sep 15 09:32:46 CST 2023 on pts/0 This account is currently not available.查看 mysql用户信息 cat /etc/passwd | grep mysql他是 mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin把 /sbin /nologin 改成 /b…

使用阿里PAI DSW部署Stable Diffusion WebUI

进入到网址https://pai.console.aliyun.com/里边。 点击创建实例。 把实例名称填写好,选择GPU规格,然后选择实例名称是ecs.gn6v-c8g1.2xlarge。 选择stable-diffusion-webui-env:pytorch1.13-gpu-py310-cu117-ubuntu22.04,然后点击下一步。…

云原生Kubernetes:K8S集群使用带凭证的harbor仓库

目录 一、理论 1.部署harbor 创建私有项目,使用凭证登录 二、实验 1.部署harbor 创建私有项目,使用凭证登录 三、问题 1.harbor页面无法打开 2.生成harbor 登录凭据资源清单报错 3.tomcat-deployment 资源生成报错 一、理论 1.部署harbor 创建私…

CSV文件打开乱码解决方案

思路 借助第三方软件转码即可。 案例 打开CSV文件显示如下: 导入到python中,借助pandas文件读取 另存为csv文件格式即可 代码如下: import pandas as pd df pd.read_csv(rD:\BaiduNetdiskDownload\csv&xlsx版数据\城市产业创新指数…

人工智能现在可以从文本中生成具有CD音质的音乐,而且只会越来越好

想象一下,键入“戏剧性的介绍音乐”并听到一首飙升的交响乐,或者编写“令人毛骨悚然的脚步声”并获得高质量的音效。这是稳定音频的承诺,一个文本到音频的人工智能模型周三宣布由能合成立体声的稳定人工智能44.1千赫来自文字描述的音乐或声音…

antv-G6知识图谱安装--使用(实例)--连接线修改成动态,并添加跟随线移动的光圈,设置分支跟踪定位功能

这系列文章主要是完成一个图谱的自定义修改(最近太忙了长篇分段更新自己使用流程) 1. 连接线修改成动态,并添加跟随线移动的光圈 2. 自定义卡片样式和文字内容 3. 自定义伸缩节点的样式,并添加动画样式 3. 自定义弹窗样式 4. 自定…

Redis缓存更新策略、详解并发条件下数据库与缓存的一致性问题以及消息队列解决方案

0、前言 我们知道,缓存由于在内存中,数据处理速度比直接操作数据库要快很多,因此常常将数据先读到缓存中,再进行查询、更新等操作。 但与之而来的问题就是,内存中的数据不仅没有持久化,而且需要保证…

Dajngo02_第一个Django案例

Dajngo02_第一个Django案例 经过之前学习,我们已经可以创建Django环境 现在开始尝试快速使用Django开发一个案例 案例:利用Django实现一个查看当前时间的web页面。 在django中要提供数据展示给用户,一般情况下我们需要完成3个步骤: 在urls.…

如何选择合适的预测性维护工具和平台

随着技术的不断进步,预测性维护(Predictive Maintenance,简称PdM)已经成为许多企业提高生产效率、减少停机时间和维护成本的核心策略。然而,选择适合自己业务需求的PdM工具和平台可能并不容易。本文将为您提供一些关键…

传统机器学习总结以及深度学习初识

传统机器学习总结以及深度学习初识 文章目录 前言一、传统机器学习总结1.1. 监督学习算法(Supervised Learning)1.2. 无监督学习算法(Unsupervised Learning) 二、深度学习初识三、github与gitee的介绍3.1. GitHub:3.2…

Sqlserver 监控使用磁盘空间情况

最近遇到一个小问题:为了保存以往的一些数据,间了大量临时表,导致SQLserver 数据增长过快,不得不想个办法监控磁盘空间使用情况。 网上一般有几种办法: 一是使用 dm_os_volume_stats函数,缺点是 无法获取非…

【实践篇】MySQL执行计划详解

文章目录 本文知识大纲速览1. 前言2. 基本介绍1. 什么是执行计划2. 如何查看执行计划3. 执行计划的组成部分 3. 执行计划的关键元素1. id2. select_type3. table:4. type:5. possible_keys:6. key:7. key_len8. ref:9. rows:10. Extra 4. 底层原理5. 执行计划示例解读本文知识图…

本地引入 Axios 报错

目录 报错信息: 报错截图: ​编辑报错原因: 解决方法: ​编辑运行结果成功: 报错信息: Cannot read properties of undefined (reading post) TypeError: Cannot read properties of undefined (rea…

SpringBoot,Mybatis 使用Java8(JSR310)时间日期规范

目录 一. 依赖二. 前台三. Controller&#xff0c;Form&#xff0c;Service四. 数据库类型五. 效果 一. 依赖 ⏹若使用的是SpringBoot <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifac…

Microsoft 365跨平台协同办公功能,实现Mac、iOS、Windows用户的实时无缝协作

Microsoft 365 for Mac(Office 365)现已更新&#xff0c;最新版本的Microsoft 365 现已支持跨平台协同办公&#xff0c;接下来为你介绍一些使用office 365 Mac版进行创作及写作的好方法。 Microsoft 365 在全平台共用相同的代码库&#xff0c;这意味着使用 Mac、ios 和Windows…

【日积月累】SpringBoot启动流程

目录 SpringBoot启动流程 1.前言2.构造一个SpringApplication的实例&#xff0c;完成初始化的工作SpringApplication实例构造完之后调用run方法&#xff0c;启动SpringApplication3.SpringBoot启动代码SpringBootConfigurationComponentScanEnableAutoConfiguration 总结参考…

随手笔记(四十六)——idea source root错乱

一般问题会出现在这里&#xff0c;写着别的项目的项目名&#xff0c;就是因为reload了别的项目的maven文件&#xff0c;借鉴了很多网上的说法&#xff0c;比如改project Structure里面改子项目的source。确实讲得挺好&#xff0c;就是不会用&#xff1b;所以最后的解决方案就是…

多云系列|10个关键的多云战略:简介

随着VMware继续向客户介绍多云问题以及VMware跨云服务在云智能计算历程中的优势&#xff0c;有一个问题经常被提及&#xff0c;“我如何开始&#xff1f;”。本博客系列旨在为客户提供指导&#xff0c;并回顾多云的十大领域&#xff0c;介绍我们应该关注哪些方面。此外&#xf…

引领UI设计生产工具进入AI时代,猿辅导旗下Motiff发布三大AI功能

近期&#xff0c;IXDC 2023国际体验设计大会在北京国家会议中心举行&#xff0c;共邀请全球800企业&#xff0c;1000名设计师共襄主题为“设计领导力”的创新盛会。作为全球最具影响力的创新设计大会之一&#xff0c;大会围绕创新、系统、商业三个关键维度&#xff0c;结合在AI…

MySQL优化第二篇

MySQL优化第二篇 性能分析小表驱动大表慢查询日志日志分析工具mysqldumpslow Show Profile进行SQL分析&#xff08;重中之重&#xff09; 七种JOIN 1、inner join &#xff1a;可以简写为join&#xff0c;表示的是交集&#xff0c;也就是两张表的共同数据 sql语句&#xff1a…