1.MySQL臨時表引擎,名為Memory。例如
創建表tmp1(id int,str 1 varchar(100))engine = memory;
由參數max_heap_table_size控制,超過了錯誤報告。
2.非臨時表引擎分為兩類:
用戶定義的臨時表,例如:
創建臨時表(id int,str 1 varchar(100));
SQL執行過程中產生的內部臨時表,如:UNION、聚合類ORDER BY、派生表、大型對象字段的查詢、子查詢或半連接固化等。
所以通常使用這兩個臨時表的計數器?顯示全局狀態,如“% tmp _% tables%”以查看。例如
mysql & gt顯示類似“%tmp_%tables%”的狀態;` `+-+`|變量名稱?| Value | ` `+-+-+`| Created _ tmp _ disk _ tables | 0 | ` `| Created _ tmp _ tables?集合中的| 0 | ` `+-+`` 2行(0.00秒)
上述結果表示只創建了磁盤上的臨時表計數和臨時表總數。這兩個計數器由參數tmp_table_size和max_heap_table_size的最小值控制。
在MySQL 5.7之前,這個SQL操作生成的臨時表是MYISAM,而且只能是MYISAM。然後MySQL從5.7開始提供了參數internal _ tmp _ mem _ storage _ engine來定義內部臨時表引擎,可選值為MYISAM和INNODB。當然,這裏我們選擇INNODB。並且內部臨時表默認保存在臨時表空間ibtmp1(可以用參數innodb_temp_data_file_path等設置大小和步長。).當然我們這裏要控制好ibtmp1的大小,不然壹個不好的SQL會爆盤。
但是,MySQL 5.7之前並沒有解決以下問題:
VARCHAR的可變長度存儲。也就是說,如果臨時表的字段定義是VARCHAR(200),那麽映射到內存中處理的字段就變成CHAR(200)。假設VARCHAR(200)裏面只有壹個字符“y”,那豈不是極大的浪費?
大對象的默認磁盤存儲,如TEXT、BLOB、JSON等。,不管裏面存儲的是什麽,都直接轉換成磁盤存儲。
從MySQL 8.0開始,專門實現了臨時表引擎TempTable,解決了VARCHAR字段的邊長存儲和大型對象的內存存儲問題。由變量Inter _ TMP _ MEM _存儲_引擎控制,可選值為TempTable(默認)和Memory;新引擎的大小由參數temp_table_max_ram控制,默認值為1G。如果超過,就存儲在磁盤上(ibtmp1)。並且該計數器由性能字典的表memory _ summary _ global _ by _ event _ name存儲。
mysql & gtSELECT * FROM performance_schema。memory _ summary _ global _ by _ event _ name其中event _ name like ' % temptable % ' G * * * * * * * * * * * * * * * * * * * * * * * * 1。行**************************?EVENT _ NAME:* * memory/temptable/physical _ disk * * COUNT _ ALLOC:0?COUNT_FREE: 0?SUM _ NUMBER _ OF _ BYTES _ ALLOC:0 SUM _ NUMBER _ OF _ BYTES _ FREE:●COUNT _ USED:0?當前計數已用:0高計數已用:0低字節數已用:0當前字節數已用:0?已用字節數上限:0 * * * * * * * * * * * * * * * * * * * * * * * 2。行**************************?EVENT _ NAME:* * memory/temptable/physical _ ram * * COUNT _ ALLOC:1?COUNT_FREE: 0?SUM _ NUMBER _ OF _ BYTES _ ALLOC:1048576 SUM _ NUMBER _ OF _ BYTES _ FREE:0?●COUNT _ USED:0?當前計數已用:1高計數已用:1低字節數已用:0當前字節數已用:1048576?已用字節數上限:集合中的10485762行(0.03秒)
上面的memory/temptable/physical_disk表示放在磁盤上的臨時表的計數。
Memory/temptable/physical_ram表示放入內存的臨時表的數量。
然後總結壹下MySQL 8.0引入的TempTable引擎:
默認內部臨時表引擎。
支持可變長度字符類型的實際存儲。
設置變量temp_table_max_ram來控制實際存儲內存區域的大小。