問題的形式解答:
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、源城網(wǎng)站維護(hù)、網(wǎng)站推廣。
一、MySQL在什么情況下會(huì)創(chuàng)建臨時(shí)表(Internal Temporary Table Use in MySQL)?
我列舉3個(gè)
1. UNION查詢;
2. insert into select ...from ...
3. ORDER BY和GROUP BY的子句不一樣時(shí);
4.數(shù)據(jù)表中包含blob/text列
等等,其實(shí)還有好多。具體參考 https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html
二、怎么知道m(xù)ysql用了臨時(shí)表呢?
這個(gè)問題很簡單, EXPLAIN 查看執(zhí)行計(jì)劃結(jié)果的 Extra 列中,如果包含 Using Temporary 就表示會(huì)用到臨時(shí)表。舉個(gè)例子,有個(gè)感性認(rèn)識。
創(chuàng)建測試表t22 :create table t22 as select * from information_schema.tables;
mysql> desc t22; +-----------------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+---------------------+------+-----+---------+-------+ | TABLE_CATALOG | varchar(512) | NO | | | | | TABLE_SCHEMA | varchar(64) | NO | | | | | TABLE_NAME | varchar(64) | NO | | | | | TABLE_TYPE | varchar(64) | NO | | | | | ENGINE | varchar(64) | YES | | NULL | | | VERSION | bigint(21) unsigned | YES | | NULL | | | ROW_FORMAT | varchar(10) | YES | | NULL | | | TABLE_ROWS | bigint(21) unsigned | YES | | NULL | | | AVG_ROW_LENGTH | bigint(21) unsigned | YES | | NULL | | | DATA_LENGTH | bigint(21) unsigned | YES | | NULL | | | MAX_DATA_LENGTH | bigint(21) unsigned | YES | | NULL | | | INDEX_LENGTH | bigint(21) unsigned | YES | | NULL | | | DATA_FREE | bigint(21) unsigned | YES | | NULL | | | AUTO_INCREMENT | bigint(21) unsigned | YES | | NULL | | | CREATE_TIME | datetime | YES | | NULL | | | UPDATE_TIME | datetime | YES | | NULL | | | CHECK_TIME | datetime | YES | | NULL | | | TABLE_COLLATION | varchar(32) | YES | | NULL | | | CHECKSUM | bigint(21) unsigned | YES | | NULL | | | CREATE_OPTIONS | varchar(255) | YES | | NULL | | | TABLE_COMMENT | varchar(2048) | NO | | | | +-----------------+---------------------+------+-----+---------+-------+ 21 rows in set (0.02 sec) mysql> explain -> select table_schema ,table_name, create_time from t22 where table_schema like 'test%' -> union -> select table_schema ,table_name, create_time from t22 where table_schema like 'information%' -> ; +----+--------------+------------+------------+------+---------------+------+---------+------+----------+----------+-----------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+--------------+------------+------------+------+---------------+------+---------+------+----------+----------+-----------------+ | 1 | PRIMARY | t22 | NULL | ALL | NULL | NULL | NULL | NULL | 12522369 | 11.11 | Using where | | 2 | UNION | t22 | NULL | ALL | NULL | NULL | NULL | NULL | 12522369 | 11.11 | Using where | | NULL | UNION RESULT | <union1,2> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Using temporary | +----+--------------+------------+------------+------+---------------+------+---------+------+----------+----------+-----------------+ 3 rows in set, 1 warning (0.02 sec)
三、臨時(shí)表有關(guān)的參數(shù)有哪些?
innodb_temp_data_file_path = ibtmp1:12M:autoextend
tmp_table_size = 16777216
max_heap_table_size =16777216
default_tmp_storage_engine=InnoDB
internal_tmp_disk_storage_engine= InnoDB
四、mysql臨時(shí)表配置參數(shù)是tmp_table_size,當(dāng)臨時(shí)表空間不夠用的時(shí)候怎么辦?
如果臨時(shí)表中需要存儲(chǔ)的數(shù)據(jù)量超過了上限( tmp-table-size 或 max-heap-table-size 中取其大者),這時(shí)候就需要生成基于磁盤的臨時(shí)表了。也就是放在innodb_temp_data_file_path指定的臨時(shí)表空間中。
如果你對這句話有疑問,那我舉個(gè)例子來看下:反復(fù)執(zhí)行語句: insert into t22 select * from t22; 同時(shí)查看表空間ibtmp1的大小變化。反復(fù)執(zhí)行insert 語句,插入表中的數(shù)量指數(shù)級增長。
看下例子:
五、看圖說話,做了上個(gè)實(shí)驗(yàn),不知道你是否會(huì)有如下想法:既然內(nèi)部臨時(shí)表(Internal Temporary Table)用于排序,分組,當(dāng)需要的存儲(chǔ)空間超過 tmp-table-size 上限的時(shí)候,使用臨時(shí)表空間。臨時(shí)表空間是磁盤,速度比不上內(nèi)存,那是不是可以加大tmp_table_size來優(yōu)化需要使用臨時(shí)表的SQL語句?
當(dāng)然可以呀,tmp_table_size最大值是18446744073709551615,如果建議256M。
六、mysql中是如何監(jiān)控臨時(shí)表和臨時(shí)表空間使用情況的?
mysql> show status like '%tmp%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 1 | | Created_tmp_files | 7 | | Created_tmp_tables | 18 | +-------------------------+-------+
建議Created_tmp_disk_tables/Created_tmp_tables不要超過25%。如果Created_tmp_disk_tables數(shù)量很大,查看是否有很多慢sql,是否有很多使用臨時(shí)表的語句。加大 tmp_table_size 的值。
七、mysql的臨時(shí)表空間文件暴增,可以達(dá)到幾百G,你認(rèn)為形成的原因是什么?
第四個(gè)問題做的例子,如果你不停的反復(fù)的實(shí)驗(yàn),你會(huì)發(fā)現(xiàn)ibtmp1增長的速度驚人。有個(gè)項(xiàng)目,曾經(jīng)ibtmp1暴增到300G。一看慢sql日志,有大量慢sql,而且有很多語句需要排序。所以給ibtmp1加上限制最大值。innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:5G,mysql會(huì)反復(fù)利用。
參考:老葉茶館
https://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=207355450&idx=3&sn=3e3a2c0a7497a8cd099ddc5c33a9932d&scene=21#wechat_redirect
文章名稱:mysql臨時(shí)表,臨時(shí)表空間,ibtmp1表空間暴增原因初探
轉(zhuǎn)載注明:http://www.chinadenli.net/article36/jigcpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、軟件開發(fā)、網(wǎng)站策劃、虛擬主機(jī)、電子商務(wù)、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)