MySQL有一些平常會在一些配置里看到,但似乎沒有太多的關注的參數或則功能,都是默默支持著整個MySQL體系運轉,這里所介紹的就是臨時表。
MySQL臨時表在很多場景中都會用到,比如用戶自己創建的臨時表用于保存臨時數據,以及MySQL內部在執行復雜SQL時,需要借助臨時表進行分組、排序、去重等操作。下面將會對MySQL臨時表的一些概念、分類和常見問題進行整理。
MySQL臨時表類型
1.外部臨時表,通過create temporary table語法創建的臨時表,可以指定存儲引擎為memory,innodb, myisam等等,這類表在會話結束后,會被自動清理。如果臨時表與非臨時表同時存在,那么非臨時表不可見。show tables命令不顯示臨時表信息。
可通過informationschema.INNODBTEMPTABLEINFO系統表可以查看外部臨時表的相關信息,這部分使用的還是比較少。
2.內部臨時表,通常在執行復雜SQL,比如group by, order by, distinct, union等,執行計劃中如果包含Using temporary,還有undo回滾的時候,但空間不足的時候,MySQL內部將使用自動生成的臨時表,以輔助完成工作。
MySQL臨時表相關參數
1.maxheaptablesize:用戶創建的內存表的最大值,也用于和tmptable_size一起,限制內部臨時表在內存中的大小;
2.tmptablesize:內部臨時表在內存中的的最大值,與maxheaptable_size參數共同決定,取二者的最小值。如果臨時表超過該值,就會從內存轉移到磁盤上;
3.innodbtmpdir:online ALTER TABLE operations that rebuild the table maxtmp_tables;
4.defaulttmpstorage_engine:外部臨時表(create temporary table創建的表)默認的存儲引擎;
5.innodbtempdatafilepath:innodb引擎下temp文件屬性。建議限制innodbtempdatafilepath = ibtmp1:1G:autoextend:max:30G;
6.Internaltmpdiskstorageengine:磁盤上的內部臨時表存儲引擎,可選值為myisam或者innodb。使用innodb表在某些場景下,比如臨時表列太多,或者行大小超過限制,可能會出現“ Row size too large or Too many columns”的錯誤,這時應該將臨時表的innodb引擎改回myisam。tmpdir:臨時表目錄,當臨時表大小超過一定閾值,就會從內存轉移到磁盤上;
7.tmpdir變量表示磁盤上臨時表所在的目錄。
MySQL臨時表相關狀態變量
1.Createdtmpdisk_tables:執行SQL語句時,MySQL在磁盤上創建的內部臨時表數量,如果這個值很大,可能原因是分配給臨時表的最大內存值較小,或者SQL中有大量排序、分組、去重等操作,SQL需要優化;
2.Createdtmpfiles:創建的臨時表數量;
3.Createdtmptables:執行SQL語句時,MySQL創建的內部臨時表數量;
4.Slaveopentemp_tables statement 或則 mix模式下才會看到有使用;
slaveopentemptables 的值顯示,通過復制,當前slave創建了多少臨時表,binlogformat只能是statement 和 mixed 下有效。
備注:stop slave 也沒有用,必須主庫手動刪除 或則 session退出 才可以。
以下是從庫binlog記錄信息:
MySQL臨時表注意事項
...
? 接下來內容請訪問原文(https://www.modb.pro/db/27858?YYF)進行查看~
更多數據庫相關內容,可訪問墨天輪(https://www.modb.pro/?YYF)進行瀏覽。