《MySQL 5.7臨時表空間怎么玩才能不掉坑里》要點:
本文介紹了MySQL 5.7臨時表空間怎么玩才能不掉坑里,希望對您有用。如果有疑問,可以聯系我們。
MySQL 5.7起支持獨立臨時表空間,但個別時候也可能會踩坑的.
MySQL 5.7起,開始采用獨立的臨時表空間(和獨立的undo表空間不是一回事喲),命名ibtmp1文件,初始化12M,且默認無上限.
選項?innodb_temp_data_file_path?可配置臨時表空間相關參數.
innodb_temp_data_file_path = ibtmp1:12M:autoextend
有時執行SQL請求時會產生臨時表,極端情況下,可能導致臨時表空間文件暴漲,幫人處理過的案例中最高漲到快300G,比以前遇到的 ibdata1 文件暴漲還要猛…
表DDL
CREATE TEMPORARY TABLE `tmp1` ( ?`id` int(10) unsigned NOT NULL DEFAULT '0', ?`name` varchar(50) NOT NULL DEFAULT '', ?`aid` int(10) unsigned NOT NULL AUTO_INCREMENT, ?`nid` int(11) unsigned GENERATED ALWAYS AS ((`id` + 1)) VIRTUAL NOT NULL, ?`nnid` int(11) unsigned GENERATED ALWAYS AS ((`id` + 1)) STORED NOT NULL, ?PRIMARY KEY (`aid`), ?KEY `name` (`name`), ?KEY `id` (`id`), ?KEY `nid` (`nid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
原表大小只有 120MB,從這個表直接?INSERT…SELECT?導數據到tmp1表.
-rw-r----- ?1 yejr ?imysql ? 120M Apr 14 10:52 /data/mysql/test/sid.ibd
生成臨時表(去掉虛擬列,臨時表不支持虛擬列,然后寫入數據),還更大了(我也不解,以后有機會再追查原因).
-rw-r----- ?1 yejr ?imysql ? 140M Jun 25 09:55 /Users/yejinrong/mydata/ibtmp1
查看臨時表元數據信息
yejr@imysql.com [test]>select * from INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G *********************** 1. row *********************** ? ? ? ? ? ?TABLE_ID: 405 ? ? ? ? ? ? ? ?NAME: #sql14032_300000005_3 ? ? ? ? ? ? ?N_COLS: 6 ? ? ? ? ? ? ? SPACE: 421 PER_TABLE_TABLESPACE: FALSE ? ? ? IS_COMPRESSED: FALSE
再刪除索引,結果,又更大了
-rw-r----- ?1 yejr ?imysql ? 204M Jun 25 09:57 /data/mysql/ibtmp1
第二次測試刪除索引后,變成了200M(因為第二次測試時,我設置了臨時表最大200M)
innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:200M
-rw-r----- ?1 yejr ?imysql ? 200M Jun 25 10:15 /data/mysql/ibtmp1
執行一個會產生臨時表的慢SQL.
注:MySQL 5.7起,執行UNION ALL不再產生臨時表(除非需要額外排序).
yejr@imysql.com [test]>explain select * from tmp1 union ?select id,name,aid from sid\G *************************** 1. row *************************** ? ? ? ? ? id: 1 ?select_type: PRIMARY ? ? ? ?table: tmp1 ? partitions: NULL ? ? ? ? type: ALL possible_keys: NULL ? ? ? ? ?key: NULL ? ? ?key_len: NULL ? ? ? ? ?ref: NULL ? ? ? ? rows: 3986232 ? ? filtered: 100.00 ? ? ? ?Extra: NULL *************************** 2. row *************************** ? ? ? ? ? id: 2 ?select_type: UNION ? ? ? ?table: sid ? partitions: NULL ? ? ? ? type: ALL possible_keys: NULL ? ? ? ? ?key: NULL ? ? ?key_len: NULL ? ? ? ? ?ref: NULL ? ? ? ? rows: 802682 ? ? filtered: 100.00 ? ? ? ?Extra: NULL *************************** 3. row *************************** ? ? ? ? ? id: NULL ?select_type: UNION RESULT ? ? ? ?table: <union1,2> ? partitions: NULL ? ? ? ? type: ALL possible_keys: NULL ? ? ? ? ?key: NULL ? ? ?key_len: NULL ? ? ? ? ?ref: NULL ? ? ? ? rows: NULL ? ? filtered: NULL ? ? ? ?Extra: Using temporary
文件漲到588M還沒結束,我直接給卡了
-rw-r----- ?1 yejr ?imysql ? 588M Jun 25 10:07 /data/mysql/ibtmp1
第二次測試時,設置了臨時表空間文件最大200M,再執行會報錯:
yejr@imysql.com [test]>select * from tmp1 union select id,name,aid from sid; ERROR 1114 (HY000): The table '/var/folders/bv/j4tjn6k54dj5jh1tl8yn6_y00000gn/T/#sql14032_5_8' is full
文章來自微信公眾號:
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/2215.html