时间:2021-07-01 10:21:17 帮助过:49人阅读
导读
MySQL 5.7的目标是成为发布以来最安全的MySQL服务器,其在SSL/TLS和全面安全开发方面有一些重要的改变。
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
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
参考
[MySQL FAQ]系列 — 什么情况下会用到临时表
FAQ系列 | 如何避免ibdata1文件大小暴涨
https://dev.mysql.com/doc/refman/5.7/en/temporary-files.html
https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_temp_data_file_path
https://dev.mysql.com/doc/refman/5.7/en/innodb-temporary-tablespace.html