深入理解MySQL_6 Temporary临时表

田超凡

1 临时表概念

MySQL临时表在很多场景中都会用到,比如用户自己创建的临时表用于【保存临时数据】,以及MySQL内部在执行【复杂SQL】时,需要借助临时表进行【分组、排序、去重】等操作,临时表具有一下几个特点:

(1)临时表不能通过show tables查看,在服务器重启之后,所有的临时表将全部被销毁。

(2)临时表是每个进程独享的,当前进程(客户端)创建的临时表,其他进程(客户端)是查不到临时表里面的数据的,所以不同客户端可以创建同名的临时表。

2 临时表分类

(1)外部临时表

通过create temporary table语句创建的临时表为外部临时表

(2)内部临时表

用来存储某些操作的【中间结果】,这些操作可能包括在【优化阶段】或者【执行阶段】,这种内部表对用户来说是不可见的。通常在执行复杂SQL语句时,比如group by,distinct,union等语句时,MySQL内部将使用【自动生成的临时表】,以辅助SQL的执行。我们可以使用执行计划查看,如果一条sql语句的执行计划中【列extra】结果为Using temporary,那么也就说明这个查询要使用到临时表。

3 group by执行流程

(1)创建一个内部临时表,有两列,一列是age,一列是count(*)。

(2)全表扫描【原始表】(聚簇索引会在后边的内容讲解),每扫描一条数据进行一次判断,第一种情况,这条数据的年龄在临时表中不存在,则将年龄填入,count列填1。第二种情况,该条数据在临时表中存在,则将count列加1。临时表的存在是为了辅助计算。

(3)对临时表的数据按照年龄进行排序。

4 内部临时表创建时机

MySQL在以下几种情况会创建临时表:

(1)使用GROUP BY分组,且分组字段没有索引时。

(2)使用DISTINCT查询。

(3)使用UNION进行结果合并,辅助去重。(【union all】不会使用零时表,因为他不需要去重)

5 其他临时表

其实临时表还可以分为【内存临时表】和【磁盘临时表】。内存临时表使用memery引擎(Memory引擎不支持BOLB和TEXT类型),磁盘临时表默认使用innodb引擎。在以下几种情况下,会创建磁盘临时表:

1、数据表中包含BLOB/TEXT列;

2、在 GROUP BY 或者 DSTINCT 的列中有超过 512字符的字符类型列;

3、在SELECT、UNION、UNION ALL查询中,存在最大长度超过512的列(对于字符串类型是512个字符,对于二进制类型则是512字节);

相关推荐
七夜zippoe10 小时前
OpenClaw 数据加密:敏感信息保护的完整方案
数据库·mysql·php·openclaw·敏感保护
万亿少女的梦16810 小时前
基于Node.js和Express的旅游信息管理平台设计与开发
mysql·node.js·express·系统设计·旅游信息管理
我命由我1234521 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
万亿少女的梦16821 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
万亿少女的梦16821 小时前
基于SpringBoot与Vue的历史博物馆展品展示与游客管理系统设计
spring boot·mysql·vue·系统设计·博物馆管理系统
灯澜忆梦1 天前
MySQL 完整学习路线
学习·mysql
ClouGence1 天前
保障公共安全,一线治安机构实时数据应用与实践
数据库·mysql·postgresql
Minxinbb1 天前
TDSQL for MySQL 服务器重启操作
数据库·mysql·dba
渣渣灰飞1 天前
MySQL 系统学习 第二阶段 第三章 DQL(Data Query Language)第三节:ORDER BY + LIMIT(排序 + 分页)
数据库·学习·mysql
fengbingchun1 天前
客户端获取服务器端MySQL数据库表中数据C++实现
mysql