臨時表的存儲引擎
在 MySQL 5.6 之前,所有磁盤上的臨時表都默認創建為 MyISAM 類型。臨時表是在內存中,還是在磁盤上創建,具體取決於配置,並在查詢結束時立即刪除。從 MySQL 5.7 開始,它們默認創建為 InnoDB 類型。
新默認值可提升整體性能,大多數情況下都是最佳選擇。
可以使用新的配置項來設置臨時表的存儲引擎:internal_tmp_disk_storage_engine ,可選值為 InnoDB(默認)或 MyISAM。
InnoDB 類型的臨時表存在的潛在問題
盡管使用 InnoDB 是性能最佳的,但可能會出現新的潛在問題。在某些特定情況下,您可能會出現磁盤耗盡和服務器中斷。
與數據庫中的任何其他 InnoDB 表壹樣,臨時表具有自己的表空間文件。新文件與通用表空間壹起位於數據目錄中,名稱為 ibtmp1。它存儲所有 tmp 表。不運行手動運行 OPTIMIZE TABLE,表空間文件就會不斷增長。如果妳不能使用 OPTIMIZE,那麽唯壹能將 ibtmp1 大小縮小為零的方法,就是重新啟動服務器。幸運的是,即使文件無法減小,在執行查詢後,臨時表也會自動刪除,表空間可回收使用。現在,我們想壹想以下情境:
存在未優化的查詢,需要在磁盤上創建非常大的的臨時表
存在優化的查詢,但他們正在磁盤上創建非常大的臨時表,因為妳正在對此數據集進行計算(統計,分析)
高並發連接時,運行相同的查詢,伴隨臨時表的創建
沒有很多可用空間
在這些情況下,文件 ibtmp1 大大增加,很容易耗盡可用空間。這種情況每天發生幾次,並且必須重啟服務器才能完全縮小 ibtmp1 表空間。使用不可收縮的文件可以輕松耗盡磁盤空間!