MySQL使用臨時表的情況

2021-07-26 03:51:20 字數 1612 閱讀 7451

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 產生臨時表的幾種情況

1 union查詢 2 用到temptable演算法或者是union查詢中的檢視 3 order by和group by的子句不一樣時 4 表連線中,order by的列不是驅動表中的 5 distinct查詢並且加上order by時 6 sql中用到sql small result選項時 7 f...

mysql臨時表的使用

mysql使用temporary關鍵字可以建立出乙個臨時表。建立的這張表會在於伺服器的會話終止時自動消失。語法 create temporary table 表名 規則 每個會話只能看到自己建立的臨時表,不同的會話可以建立相同表名稱的臨時表。臨時表的表名可以和永久表的名字相同。a 臨時表再斷開於my...

mysql臨時表更新 MySql 臨時表

今天在專案中遇到乙個,當mysql的in語句中資料量很大時,建立乙個臨時表的例子。於是樓主整理了一下關於臨時表的知識,與大家分享一下 首先,臨時表只在當前連線可見,當關閉連線時,mysql會自動刪除表並釋放所有空間。因此在不同的連線中可以建立同名的臨時表,並且操作屬於本連線的臨時表。建立臨時表 cr...