MySQL问答系列之什么情况下会用到临时表

 更新时间:2018年09月12日 10:26:17   作者:叶金荣  
MySQL在很多情况下都会用到临时表,下面这篇文章主要给大家介绍了关于MySQL在什么情况下会用到临时表的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧

临时表介绍

什么是临时表:MySQL用于存储一些中间结果集的表,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。为什么会产生临时表:一般是由于复杂的SQL导致临时表被大量创建

临时表分为两种,一种是内存临时表,一种是磁盘临时表。内存临时表采用的是memory存储引擎,磁盘临时表采用的是myisam存储引擎(磁盘临时表也可以使用innodb存储引擎,通过internal_tmp_disk_storage_engine参数来控制使用哪种存储引擎,从mysql5.7.6之后默认为innodb存储引擎,之前版本默认为myisam存储引擎)。分别通过Created_tmp_disk_tables 和 Created_tmp_tables 两个参数来查看产生了多少磁盘临时表和所有产生的临时表(内存和磁盘)。

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

1、UNION查询;

2、用到TEMPTABLE算法或者是UNION查询中的视图;

3、ORDER BY和GROUP BY的子句不一样时;

4、表连接中,ORDER BY的列不是驱动表中的;

5、DISTINCT查询并且加上ORDER BY时;

6、SQL中用到SQL_SMALL_RESULT选项时;

7、FROM中的子查询;

8、子查询或者semi-join时创建的表;

EXPLAIN 查看执行计划结果的 Extra 列中,如果包含 Using Temporary 就表示会用到临时表。

当然了,如果临时表中需要存储的数据量超过了上限( tmp-table-size 或 max-heap-table-size 中取其大者),这时候就需要生成基于磁盘的临时表了。

在以下几种情况下,会创建磁盘临时表:

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

2、在 GROUP BY 或者 DSTINCT 的列中有超过 512字符 的字符类型列(或者超过 512字节的 二进制类型列,在5.6.15之前只管是否超过512字节);

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

4、执行SHOW COLUMNS/FIELDS、DESCRIBE等SQL命令,因为它们的执行结果用到了BLOB列类型。

从5.7.5开始,新增一个系统选项 internal_tmp_disk_storage_engine 可定义磁盘临时表的引擎类型为 InnoDB,而在这以前,只能使用 MyISAM。而在5.6.3以后新增的系统选项 default_tmp_storage_engine 是控制 CREATE TEMPORARY TABLE 创建的临时表的引擎类型,在以前默认是MEMORY,不要把这二者混淆了。

详见下例

mysql> set default_tmp_storage_engine = "InnoDB";
-rw-rw---- 1 mysql mysql 8558 Jul 7 15:22 #sql4b0e_10_0.frm -- InnoDB引擎的临时表
 -rw-rw---- 1 mysql mysql 98304 Jul 7 15:22 #sql4b0e_10_0.ibd
-rw-rw---- 1 mysql mysql 8558 Jul 7 15:25 #sql4b0e_10_2.frm

mysql> set default_tmp_storage_engine = "MyISAM";
-rw-rw---- 1 mysql mysql 0 Jul 7 15:25 #sql4b0e_10_2.MYD -- MyISAM引擎的临时表
 -rw-rw---- 1 mysql mysql 1024 Jul 7 15:25 #sql4b0e_10_2.MYI

mysql> set default_tmp_storage_engine = "MEMORY";
-rw-rw---- 1 mysql mysql 8558 Jul 7 15:26 #sql4b0e_10_3.frm -- MEMORY引擎的临时表

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • mysql删除操作其实是假删除问题

    mysql删除操作其实是假删除问题

    这篇文章主要介绍了mysql删除操作其实是假删除问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • MySQL数据库中删除重复记录简单步骤

    MySQL数据库中删除重复记录简单步骤

    这篇文章主要给大家介绍了关于MySQL数据库中删除重复记录的相关资料,在使用数据库时,出现重复数据是常有的情况,但有些情况是允许数据重复的,而有些情况是不允许的,当出现不允许的情况,我们就需要对重复数据进行删除处理,需要的朋友可以参考下
    2023-08-08
  • Mysql连接无效(invalid connection)问题及解决

    Mysql连接无效(invalid connection)问题及解决

    这篇文章主要介绍了Mysql连接无效(invalid connection)问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 深入SQLite基本操作的总结详解

    深入SQLite基本操作的总结详解

    本篇文章是对SQLite的基本操作进行了总结和介绍。需要的朋友参考下
    2013-05-05
  • MySQL数据库优化经验详谈(服务器普通配置)

    MySQL数据库优化经验详谈(服务器普通配置)

    同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。
    2011-03-03
  • mysql如何修改表中某个数据

    mysql如何修改表中某个数据

    这篇文章主要介绍了mysql如何修改表中某个数据的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • MySQL存储结构用法案例分析

    MySQL存储结构用法案例分析

    这篇文章主要介绍了MySQL存储结构用法,结合具体案例形式分析了mysql存储结构相关使用方法与操作注意事项,需要的朋友可以参考下
    2018-07-07
  • mysql 8.0.19 win10快速安装教程

    mysql 8.0.19 win10快速安装教程

    这篇文章主要为大家详细介绍了mysql 8.0.19 win10快速安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • MySQL字符集乱码及解决方案分享

    MySQL字符集乱码及解决方案分享

    这篇文章主要给大家介绍了关于MySQL字符集乱码及解决方案的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Mysql数据库的一些命令

    Mysql数据库的一些命令

    如果你习惯用 windows 的数据库,也就是在 图形界面上操作数据库的话,那么当你在命令上 操作 mysql 将会感到陌生,其实只要你掌握了一些基本命令,还有经常使用,熟练起来了, 将会相当方便,而且很快速
    2013-11-11

最新评论