我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 | <union1,2> | 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 语句,插入表中的数量指数级增长。

     看下例子:

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

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



五、看图说话,做了上个实验,不知道你是否会有如下想法:既然内部临时表(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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【临时表空间组】临时表空间组的创建、维护及应用

关于临时表空间组的概念和简单描述可以参考Oracle官方文档的“Oracle Database SQL Reference”(http://download.oracle.com/docs/cd/B19306_01/server.102/b
2023-06-06

MySQL临时表满了/临时表空间耗尽的解决方法

目录解决办法在 mysql 中,当你收到“临时表满了”的警报时,通常意味着 MySQL 在处理查询时创建的临时表空间已经耗尽。这可能会导致查询失败或性能下降。临时表通常用于处理一些需要排序、分组、或者使用临时数据存储
MySQL临时表满了/临时表空间耗尽的解决方法
2024-08-14

oracle临时表空间满了的原因怎么排查

当Oracle临时表空间满了时,可能有以下原因导致:临时表空间设置太小:检查临时表空间的大小是否足够,如果不够,可以增加临时表空间的大小。临时表空间被长时间运行的查询占用:长时间运行的查询可能会使用大量的临时表空间。可以使用以下SQL语句查
oracle临时表空间满了的原因怎么排查
2024-04-09

db2怎么删除临时表空间

要删除临时表空间,您可以使用以下步骤:首先,确保没有任何连接到数据库的应用程序或会话正在使用该临时表空间。您可以使用以下命令检查活动连接:SELECT APPLICATION_HANDLE, APPLICATION_ID, AGENT_I
db2怎么删除临时表空间
2024-04-09

oracle怎么创建临时表空间

在Oracle数据库中,可以使用以下步骤创建临时表空间:首先,连接到Oracle数据库并以SYS用户身份登录。创建一个新的临时表空间,可以使用以下SQL语句:CREATE TEMPORARY TABLESPACE temp_tsTEMPF
oracle怎么创建临时表空间
2024-04-09

oracle怎么释放临时表空间

要释放Oracle数据库中的临时表空间,可以按照以下步骤进行操作:1. 首先,确保当前会话没有使用该临时表空间。可以通过执行以下查询语句来查看当前会话使用的临时表空间:```SELECT s.sid, s.serial#, p.spid,
2023-09-28

oracle临时表空间如何释放

在Oracle数据库中,临时表空间是用来存储临时数据的空间,一般用于排序、连接、分组等操作。临时表空间的释放可以通过以下步骤进行:确认当前是否还有会话在使用临时表空间。可以通过查询v$session视图或v$sort_usage视图来查看当
oracle临时表空间如何释放
2024-04-09

Oracle怎么删除临时表空间

要删除Oracle临时表空间,您可以按照以下步骤进行操作:首先,确保没有用户正在使用临时表空间。您可以通过执行以下SQL查询来检查:SELECT username FROM v$session WHERE tablespace_name
Oracle怎么删除临时表空间
2024-04-09

MySQL临时表空间满了如何释放

MySQL临时表空间是用于存储临时表数据的空间,当空间满了时,可以通过以下方法释放空间:清空临时表数据:可以通过删除或者清空临时表数据来释放空间。可以使用以下语句来清空临时表数据:TRUNCATE TABLE temp_table;重启My
MySQL临时表空间满了如何释放
2024-05-06

编程热搜

目录