原创作者: 杨涛涛

提到MySQL临时表,我们都很熟悉了,一般来说,分为两类:

1. MySQL 临时表引擎,名字叫做 Memory。比如

create table tmp1(id int, str1 varchar(100) ) engine = memory;

由参数max_heap_table_size 来控制,超过报错。

2. 非临时表的引擎,这里又分为两类:

用户自定义的临时表,比如:

create temporary table (id int, str1 varchar(100) );

SQL执行过程中产生的内部临时表,比如:UNION , 聚合类ORDER BY,派生表,大对象字段的查询,子查询或者半连接的固化等等场景。

那么这两种临时表的计数器通常用 show global status like '%tmp_%tables%' 来查看。比如

mysql> show status like '%tmp_%tables%';`

`+-------------------------+-------+`

`| Variable_name | Value |`

`+-------------------------+-------+`

`| Created_tmp_disk_tables | 0 |`

`| Created_tmp_tables | 0 |`

`+-------------------------+-------+`

`2 rows in set (0.00 sec)

以上结果分别代表,只创建磁盘上的临时表计数以及临时表的总计数。这两个计数器由参数 tmp_table_size 和 max_heap_table_size 两个取最小值来控制。

那在 MySQL 5.7 之前,这个 SQL 运行中产生的临时表是 MYISAM,而且只能是 MYISAM。那 MySQL 从 5.7 开始提供了参数 Internal_tmp_mem_storage_engine 来定义内部的临时表引擎,可选值为 MYISAM 和 INNODB 。当然这里我们选择 INNODB 。并且把内部的临时表默认保存在临时表空间 ibtmp1 **(可以用参数 innodb_temp_data_file_path 设置大小以及步长等)**下。当然这里我们得控制下 ibtmp1 的大小,要不然一个烂SQL就把磁盘整爆了。

但是MySQL 5.7 之前都没有解决如下问题:

VARCHAR的变长存储。那就是如果临时表的字段定义是 VARCHAR(200),那么映射到内存里处理的字段变为CHAR(200)。假设 VARCHAR(200) 就存里一个字符 "Y", 那岂不是很大的浪费。

大对象的默认磁盘存储,比如 TEXT,BLOB, JSON等,不管里面存放了啥,直接转化为磁盘存储。

MySQL 8.0 开始,专门实现了一个临时表的引擎 TempTable , 解决了 VARCHAR字段的边长存储以及大对象的内存存储。由变量 interal_tmp_mem_storage_engine来控制,可选值为 TempTable(默认)和 Memory;新引擎的大小由参数temp_table_max_ram 来控制,默认为1G。超过了则存储在磁盘上(ibtmp1)。并且计数器由性能字典的表 memory_summary_global_by_event_name 来存储。

mysql> SELECT * FROM performance_schema. memory_summary_global_by_event_name WHERE event_name like '%temptable%'\G

*************************** 1. row ***************************

EVENT_NAME: **memory/temptable/physical_disk**

COUNT_ALLOC: 0

COUNT_FREE: 0

SUM_NUMBER_OF_BYTES_ALLOC: 0

SUM_NUMBER_OF_BYTES_FREE: 0

LOW_COUNT_USED: 0

CURRENT_COUNT_USED: 0

HIGH_COUNT_USED: 0

LOW_NUMBER_OF_BYTES_USED: 0

CURRENT_NUMBER_OF_BYTES_USED: 0

HIGH_NUMBER_OF_BYTES_USED: 0

*************************** 2. row ***************************

EVENT_NAME: **memory/temptable/physical_ram**

COUNT_ALLOC: 1

COUNT_FREE: 0

SUM_NUMBER_OF_BYTES_ALLOC: 1048576

SUM_NUMBER_OF_BYTES_FREE: 0

LOW_COUNT_USED: 0

CURRENT_COUNT_USED: 1

HIGH_COUNT_USED: 1

LOW_NUMBER_OF_BYTES_USED: 0

CURRENT_NUMBER_OF_BYTES_USED: 1048576

HIGH_NUMBER_OF_BYTES_USED: 1048576

2 rows in set (0.03 sec)

以上 memory/temptable/physical_disk 代表放入磁盘上的临时表计数情况。

memory/temptable/physical_ram 代表放入内存的临时表计数情况。

那总结下MySQL 8.0 引入的 TempTable 引擎:

默认内部临时表引擎。

支持变长字符类型的实际存储。

设置变量 temp_table_max_ram 来控制实际存储内存区域大小。

mysql temp table_新特性解读 | MySQL 8.0 Temptable 引擎介绍相关推荐

  1. c语言 字符串 正序再倒序_新特性解读 | MySQL 8.0 索引特性3 -倒序索引

    原创作者:杨涛涛 我们今天来介绍下 MySQL 8.0 引入的新特性:倒序索引. MySQL长期以来对索引的建立只允许正向asc存储,就算建立了desc,也是忽略掉. 比如对于以下的查询,无法发挥索引 ...

  2. 中累计直方图_新特性解读 | MySQL 8.0 直方图

    原创作者:杨涛涛 MySQL 8.0 推出了histogram,也叫柱状图或者直方图.先来解释下什么叫直方图. 关于直方图 我们知道,在DB中,优化器负责将SQL转换为很多个不同的执行计划,完了从中选 ...

  3. 新特性解读 | MySQL 8.0 对 limit 的优化

    作者:杨奇龙 网名"北在南方",资深 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优.故障诊断. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不 ...

  4. MySQL 5.7 新特性解读

    2015年10月22日,MySQL发布5.7.9稳定版,虽然MySQL官方手册里已经有很多关于MySQL 5.7新特性的介绍,在这里,还是让我们一起看看在MySQL 5.7里有哪些值得我们关注的新特性 ...

  5. mysql8导入 psc 没有数据_新特性解读 | MySQL 8.0.22 任意格式数据导入

    作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...

  6. 新特性解读 | MySQL 8.0 对 GTID 的限制解除

    作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...

  7. 新特性解读 | MySQL 8.0 新密码策略(上)

    作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...

  8. mysql applier_新特性解读 | MySQL 8.0.18 有权限控制的复制

    背景 MySQL 8.0.18 以前,从服务器都是在不检查权限的情况下执行复制事务的,这样做是为了能够让主服务器获取所有内容.实际上,这意味着从机完全信任主机.但是,可能存在一些设置,其中更改跨越了主 ...

  9. mysql 8函数索引_新特性解读 | MySQL 8.0 索引特性1-函数索引

    原创作者:杨涛涛 函数索引顾名思义就是加给字段加了函数的索引,这里的函数也可以是表达式.所以也叫表达式索引. MySQL 5.7 推出了虚拟列的功能,MySQL8.0的函数索引内部其实也是依据虚拟列来 ...

  10. mysql force index报错_新特性解读 | MySQL 8.0 索引特性4-不可见索引

    MySQL 8.0 实现了索引的隐藏属性.当然这个特性很多商业数据库早就有了,比如ORACLE,在11g中就实现了.我来介绍下这个小特性. 介绍 INVISIBLE INDEX,不可见索引或者叫隐藏索 ...

最新文章

  1. Mac--常用安装命令以及问题解决(面向自己查看)
  2. Redis:相关知识点纵观
  3. xhprof windows下安装和使用(windows版本)
  4. 如何解决在onCreate()中获取View的width和Height为0?
  5. [翻译]Telnet简单介绍及在windows 7中开启Telnet客户端
  6. ecs服务器数据迁移_如何非常方便地从Windows文件服务器把数据完整地迁移到ONTAP Select...
  7. 【转】make makefile cmake qmake都是什么,有什么区别?
  8. 重新启动系统中的network服务器,linux系统调优-Network
  9. SpringBoot (一) :入门篇
  10. python调用robotframework api_python+robot framework接口自动化测试
  11. c语言编写简单的成绩管理系统,用c语言编写学生成绩管理系统
  12. vue 启动只显示error_Vue-声明式渲染
  13. 使用getApplication()作为上下文的对话框抛出“无法添加窗口-令牌null不适用于应用程序”
  14. 计算机硬件组装教学设计教案,计算机硬件的组装教学设计
  15. 解决pre-commit hook failed (add --no-verify to bypass)的问题
  16. java上传图片到oracle_JavaWeb项目 js图片上传到Oracle转为base64存入数据库
  17. 都在学奈飞 高盛要玩数据订阅
  18. 【问题5】什么是 redis 的雪崩和穿透?redis 崩溃之后会怎么样?
  19. 2008 r2 server sql 中文版补丁_SQL Server各版本代号、补丁汇总(非官方)
  20. 树莓派sensehat画图游戏 Etch a sketch

热门文章

  1. css3中的transform中的3d变换:translatez()与transform-origin-z()的区别
  2. WebService报错javax xml ws soap SOAPFaultException javax xml
  3. 使用JavaScript分别实现4种样式的九九乘法表(1X1分别在左上、左下、右上、右下)...
  4. 代码-JS之淡入淡出背景自动切换
  5. js中apply、call和bind的区别
  6. MapReduce Example
  7. Silverlight学习笔记四BusyIndicator控件(进度条)
  8. 在J2ME和WAP中实现电话呼叫功能
  9. 最严格的身份证校验(Java版)
  10. Windows中ElasticSearch的备份和还原