千家信息网

mysql临时表,临时表空间,ibtmp1表空间暴增原因初探

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,问题的形式解答:一、MySQL在什么情况下会创建临时表(Internal Temporary Table Use in MySQL)?我列举3个1. UNION查询;2. insert into se
千家信息网最后更新 2026年10月31日mysql临时表,临时表空间,ibtmp1表空间暴增原因初探

问题的形式解答:

一、MySQL在什么情况下会创建临时表(Internal Temporary Table Use in MySQL)?

我列举3个

1. UNION查询;

2. insert into select ...from ...

3. ORDER BY和GROUP BY的子句不一样时;

4.数据表中包含blob/text列

等等,其实还有好多。具体参考 https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html



二、怎么知道mysql用了临时表呢?

这个问题很简单, EXPLAIN 查看执行计划结果的 Extra 列中,如果包含 Using Temporary 就表示会用到临时表。举个例子,有个感性认识。

创建测试表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 |  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |     NULL |     NULL | Using temporary |+----+--------------+------------+------------+------+---------------+------+---------+------+----------+----------+-----------------+3 rows in set, 1 warning (0.02 sec)


三、临时表有关的参数有哪些?

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临时表配置参数是tmp_table_size,当临时表空间不够用的时候怎么办?

如果临时表中需要存储的数据量超过了上限( tmp-table-size 或 max-heap-table-size 中取其大者),这时候就需要生成基于磁盘的临时表了。也就是放在innodb_temp_data_file_path指定的临时表空间中。

如果你对这句话有疑问,那我举个例子来看下:反复执行语句: insert into t22 select * from t22; 同时查看表空间ibtmp1的大小变化。反复执行insert 语句,插入表中的数量指数级增长。

看下例子:



五、看图说话,做了上个实验,不知道你是否会有如下想法:既然内部临时表(Internal Temporary Table)用于排序,分组,当需要的存储空间超过 tmp-table-size 上限的时候,使用临时表空间。临时表空间是磁盘,速度比不上内存,那是不是可以加大tmp_table_size来优化需要使用临时表的SQL语句?

当然可以呀,tmp_table_size最大值是18446744073709551615,如果建议256M。


六、mysql中是如何监控临时表和临时表空间使用情况的?

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数量很大,查看是否有很多慢sql,是否有很多使用临时表的语句。加大 tmp_table_size 的值。


七、mysql的临时表空间文件暴增,可以达到几百G,你认为形成的原因是什么?

第四个问题做的例子,如果你不停的反复的实验,你会发现ibtmp1增长的速度惊人。有个项目,曾经ibtmp1暴增到300G。一看慢sql日志,有大量慢sql,而且有很多语句需要排序。所以给ibtmp1加上限制最大值。innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:5G,mysql会反复利用。

参考:老叶茶馆

https://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=207355450&idx=3&sn=3e3a2c0a7497a8cd099ddc5c33a9932d&scene=21#wechat_redirect

空间 语句 例子 问题 最大 上限 参数 建议 情况 数据 数量 时候 最大值 磁盘 速度 参考 增长 存储 实验 排序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡网 互联网科技企业 远信互联网科技 狮子座互联网科技有限公司 善班互联网科技有限公司 互联网高科技股票 深圳互联网科技怎么样 中国航天科技大学国际工业互联网 燊美集互联网科技有限公司 畅思互联网科技 西安小鹰速贷互联网科技有限公司 保险科技服务互联网营销体系 互联网企业科技类企业如何做账 互联网领先科技宣传片 富国互联网金融科技混合基金 从那以后互联网科技有限公司 东营紫格互联网科技 2021世界互联网领先科技成果发布 互联网科技包装股 普陀区互联网教育科技管理办法 有格互联网科技 科技和互联网公司 中国 科技 互联网 易通互联网络科技有限公司 西藏七维空间互联网科技有限公司 哈尔滨新华互联网科技学院 岳阳华臻互联网科技有限公司 广州百诚互联网科技有限公司官网 富国互联网科技002692 重庆科技产业互联网有哪些
0