外部臨時(shí)表
通過(guò)CREATE TEMPORARY TABLE 創(chuàng)建的臨時(shí)表,這種臨時(shí)表稱為外部臨時(shí)表。這種臨時(shí)表只對(duì)當(dāng)前用戶可見(jiàn)姻几,當(dāng)前會(huì)話結(jié)束的時(shí)候,該臨時(shí)表會(huì)自動(dòng)關(guān)閉势告。這種臨時(shí)表的命名與非臨時(shí)表可以同名(同名后非臨時(shí)表將對(duì)當(dāng)前會(huì)話不可見(jiàn)蛇捌,直到臨時(shí)表被刪除)。
內(nèi)部臨時(shí)表
內(nèi)部臨時(shí)表是一種特殊輕量級(jí)的臨時(shí)表咱台,用來(lái)進(jìn)行性能優(yōu)化络拌。這種臨時(shí)表會(huì)被MySQL自動(dòng)創(chuàng)建并用來(lái)存儲(chǔ)某些操作的中間結(jié)果。這些操作可能包括在優(yōu)化階段或者執(zhí)行階段回溺。這種內(nèi)部表對(duì)用戶來(lái)說(shuō)是不可見(jiàn)的春贸,但是通過(guò)EXPLAIN或者SHOW STATUS可以查看MYSQL是否使用了內(nèi)部臨時(shí)表用來(lái)幫助完成某個(gè)操作。內(nèi)部臨時(shí)表在SQL語(yǔ)句的優(yōu)化過(guò)程中扮演著非常重要的角色遗遵, MySQL中的很多操作都要依賴于內(nèi)部臨時(shí)表來(lái)進(jìn)行優(yōu)化萍恕。但是使用內(nèi)部臨時(shí)表需要?jiǎng)?chuàng)建表以及中間數(shù)據(jù)的存取代價(jià),所以用戶在寫SQL語(yǔ)句的時(shí)候應(yīng)該盡量的去避免使用臨時(shí)表车要。
內(nèi)部臨時(shí)表有兩種類型:一種是HEAP臨時(shí)表允粤,這種臨時(shí)表的所有數(shù)據(jù)都會(huì)存在內(nèi)存中,對(duì)于這種表的操作不需要IO操作翼岁。另一種是OnDisk臨時(shí)表类垫,顧名思義,這種臨時(shí)表會(huì)將數(shù)據(jù)存儲(chǔ)在磁盤上琅坡。OnDisk臨時(shí)表用來(lái)處理中間結(jié)果比較大的操作悉患。如果HEAP臨時(shí)表存儲(chǔ)的數(shù)據(jù)大于MAX_HEAP_TABLE_SIZE(詳情請(qǐng)參考MySQL手冊(cè)中系統(tǒng)變量部分),HEAP臨時(shí)表將會(huì)被自動(dòng)轉(zhuǎn)換成OnDisk臨時(shí)表榆俺。OnDisk臨時(shí)表在5.7中可以通過(guò)INTERNAL_TMP_DISK_STORAGE_ENGINE系統(tǒng)變量選擇使用MyISAM引擎或者InnoDB引擎售躁。