當前位置:成語大全網 - 書法字典 - SQL創建壹個臨時表#tabletemp,它有兩個字段“cn”和“dt ”,用於存儲另壹個表的字段名和數據類型。

SQL創建壹個臨時表#tabletemp,它有兩個字段“cn”和“dt ”,用於存儲另壹個表的字段名和數據類型。

說到MySQL臨時表,我們都很熟悉。壹般來說,它們分為兩類:

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來控制實際存儲內存區域的大小。