MySQL 什么情況下會用到臨時(shí)表

2021-09-18 16:01 更新

MySQL在以下幾種情況會創(chuàng)建臨時(shí)表:

1、UNION查詢;
2、用到TEMPTABLE算法或者是UNION查詢中的視圖;
3、ORDER BY和GROUP BY的子句不一樣時(shí);
4、表連接中,ORDER BY的列不是驅(qū)動表中的;
5、DISTINCT查詢并且加上ORDER BY時(shí);
6、SQL中用到SQL_SMALL_RESULT選項(xiàng)時(shí);
7、FROM中的子查詢;
8、子查詢或者semi-join時(shí)創(chuàng)建的表;

EXPLAIN 查看執(zhí)行計(jì)劃結(jié)果的 Extra 列中,如果包含 Using Temporary 就表示會用到臨時(shí)表。

當(dāng)然了,如果臨時(shí)表中需要存儲的數(shù)據(jù)量超過了上限( tmp-table-size 或max-heap-table-size 中取其大者),這時(shí)候就需要生成基于磁盤的臨時(shí)表了。

在以下幾種情況下,會創(chuàng)建磁盤臨時(shí)表:

1、數(shù)據(jù)表中包含BLOB/TEXT列;
2、在 GROUP BY 或者 DSTINCT 的列中有超過 512字符 的字符類型列(或者超過 512字節(jié)的 二進(jìn)制類型列,在5.6.15之前只管是否超過512字節(jié));
3、在SELECT、UNION、UNION ALL查詢中,存在最大長度超過512的列(對于字符串類型是512個(gè)字符,對于二進(jìn)制類型則是512字節(jié));
4、執(zhí)行SHOW COLUMNS/FIELDS、DESCRIBE等SQL命令,因?yàn)樗鼈兊膱?zhí)行結(jié)果用到了BLOB列類型。

從5.7.5開始,新增一個(gè)系統(tǒng)選項(xiàng)internal_tmp_disk_storage_engine 可定義磁盤臨時(shí)表的引擎類型為 InnoDB,而在這以前,只能使用 MyISAM。而在5.6.3以后新增的系統(tǒng)選項(xiàng) default_tmp_storage_engine 是控制 CREATE TEMPORARY TABLE創(chuàng)建的臨時(shí)表的引擎類型,在以前默認(rèn)是MEMORY,不要把這二者混淆了。

見下例:

mysql> set default_tmp_storage_engine = "InnoDB";
-rw-rw----   1 mysql mysql  8558 Jul  7 15:22 #sql4b0e_10_0.frm -- InnoDB引擎的臨時(shí)表
-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引擎的臨時(shí)表
-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引擎的臨時(shí)表 

延伸閱讀:

[MySQL優(yōu)化案例]系列 — 頻繁創(chuàng)建臨時(shí)表

無需過分關(guān)注Created_tmp_disk_tables

8.4.4 How MySQL Uses Internal Temporary Tables

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號