MySQL問(wèn)答系列之什么情況下會(huì)用到臨時(shí)表
臨時(shí)表介紹
什么是臨時(shí)表:MySQL用于存儲(chǔ)一些中間結(jié)果集的表,臨時(shí)表只在當(dāng)前連接可見(jiàn),當(dāng)關(guān)閉連接時(shí),Mysql會(huì)自動(dòng)刪除表并釋放所有空間。為什么會(huì)產(chǎn)生臨時(shí)表:一般是由于復(fù)雜的SQL導(dǎo)致臨時(shí)表被大量創(chuàng)建
臨時(shí)表分為兩種,一種是內(nèi)存臨時(shí)表,一種是磁盤(pán)臨時(shí)表。內(nèi)存臨時(shí)表采用的是memory存儲(chǔ)引擎,磁盤(pán)臨時(shí)表采用的是myisam存儲(chǔ)引擎(磁盤(pán)臨時(shí)表也可以使用innodb存儲(chǔ)引擎,通過(guò)internal_tmp_disk_storage_engine參數(shù)來(lái)控制使用哪種存儲(chǔ)引擎,從mysql5.7.6之后默認(rèn)為innodb存儲(chǔ)引擎,之前版本默認(rèn)為myisam存儲(chǔ)引擎)。分別通過(guò)Created_tmp_disk_tables 和 Created_tmp_tables 兩個(gè)參數(shù)來(lái)查看產(chǎn)生了多少磁盤(pán)臨時(shí)表和所有產(chǎn)生的臨時(shí)表(內(nèi)存和磁盤(pán))。
MySQL在以下幾種情況會(huì)創(chuàng)建臨時(shí)表:
1、UNION查詢(xún);
2、用到TEMPTABLE算法或者是UNION查詢(xún)中的視圖;
3、ORDER BY和GROUP BY的子句不一樣時(shí);
4、表連接中,ORDER BY的列不是驅(qū)動(dòng)表中的;
5、DISTINCT查詢(xún)并且加上ORDER BY時(shí);
6、SQL中用到SQL_SMALL_RESULT選項(xiàng)時(shí);
7、FROM中的子查詢(xún);
8、子查詢(xún)或者semi-join時(shí)創(chuàng)建的表;
EXPLAIN 查看執(zhí)行計(jì)劃結(jié)果的 Extra 列中,如果包含 Using Temporary 就表示會(huì)用到臨時(shí)表。
當(dāng)然了,如果臨時(shí)表中需要存儲(chǔ)的數(shù)據(jù)量超過(guò)了上限( tmp-table-size 或 max-heap-table-size 中取其大者),這時(shí)候就需要生成基于磁盤(pán)的臨時(shí)表了。
在以下幾種情況下,會(huì)創(chuàng)建磁盤(pán)臨時(shí)表:
1、數(shù)據(jù)表中包含BLOB/TEXT列;
2、在 GROUP BY 或者 DSTINCT 的列中有超過(guò) 512字符 的字符類(lèi)型列(或者超過(guò) 512字節(jié)的 二進(jìn)制類(lèi)型列,在5.6.15之前只管是否超過(guò)512字節(jié));
3、在SELECT、UNION、UNION ALL查詢(xún)中,存在最大長(zhǎng)度超過(guò)512的列(對(duì)于字符串類(lèi)型是512個(gè)字符,對(duì)于二進(jìn)制類(lèi)型則是512字節(jié));
4、執(zhí)行SHOW COLUMNS/FIELDS、DESCRIBE等SQL命令,因?yàn)樗鼈兊膱?zhí)行結(jié)果用到了BLOB列類(lèi)型。
從5.7.5開(kāi)始,新增一個(gè)系統(tǒng)選項(xiàng) internal_tmp_disk_storage_engine 可定義磁盤(pán)臨時(shí)表的引擎類(lèi)型為 InnoDB,而在這以前,只能使用 MyISAM。而在5.6.3以后新增的系統(tǒng)選項(xiàng) default_tmp_storage_engine 是控制 CREATE TEMPORARY TABLE 創(chuàng)建的臨時(shí)表的引擎類(lèi)型,在以前默認(rèn)是MEMORY,不要把這二者混淆了。
詳見(jiàn)下例
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í)表
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)本站的支持。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信