-
Notifications
You must be signed in to change notification settings - Fork 1.3k
什么是临时表,何时删除临时表
什么是临时表?MySQL 在执行 SQL 语句的过程中,通常会临时创建一些存储中间结果集
的表,临时表只对当前连接可见,在连接关闭时,临时表会被删除并释放所有表空间。
临时表分为两种:一种是内存临时表
,一种是磁盘临时表
,什么区别呢?内存临时表使用的是 MEMORY 存储引擎,而临时表采用的是 MyISAM 存储引擎。
MEMORY 存储引擎:
memory
是 MySQL 中一类特殊的存储引擎,它使用存储在内容中的内容来创建表,而且数据全部放在内存中。每个基于 MEMORY 存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm
类型。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。MEMORY 用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于 MEMORY 的表的生命周期很短,一般是一次性的。
MySQL 会在下面这几种情况产生临时表
-
使用 UNION 查询:UNION 有两种,一种是
UNION
,一种是UNION ALL
,它们都用于联合查询;区别是 使用 UNION 会去掉两个表中的重复数据,相当于对结果集做了一下去重(distinct)
。使用 UNION ALL,则不会排重,返回所有的行。使用 UNION 查询会产生临时表。 -
使用
TEMPTABLE 算法
或者是 UNION 查询中的视图。TEMPTABLE 算法是一种创建临时表的算法,它是将结果放置到临时表中,意味这要 MySQL 要先创建好一个临时表,然后将结果放到临时表中去,然后再使用这个临时表进行相应的查询。 -
ORDER BY 和 GROUP BY 的子句不一样时也会产生临时表。
-
DISTINCT 查询并且加上 ORDER BY 时;
-
SQL中用到 SQL_SMALL_RESULT 选项时;如果查询结果比较小的时候,可以加上 SQL_SMALL_RESULT 来优化,产生临时表
-
FROM 中的子查询;
-
EXPLAIN 查看执行计划结果的 Extra 列中,如果使用
Using Temporary
就表示会用到临时表。