先来说说临时表的概念。 临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。 临时表有下面几种:

全局临时表

这种临时表从数据库实例启动后开始生效,在数据库实例销毁后失效。在MySQL里面这种临时表对应的是内存表,即memory引擎。

会话级别临时表

这种临时表在用户登录系统成功后生效,在用户退出时失效。在MySQL里的临时表指的就是以create temporary table 这样的关键词创建的表。

事务级别临时表

这种临时表在事务开始时生效,事务提交或者回滚后失效。 在MySQL里面没有这种临时表,必须利用会话级别的临时表间接实现。

检索级别临时表

这种临时表在SQL语句执行之间产生,执行完毕后失效。 在MySQL里面这种临时表不是很固定,跟随MySQL默认存储引擎来变化。比如默认存储引擎是MyISAM,临时表的引擎就是MyISAM,并且文件生成形式以及数据运作形式和MyISAM一样,只是数据保存在内存里;如果默认引擎是INNODB,那么临时表的引擎就是INNODB,此时它的所有信息都保存在共享表空间ibdata里面。

MySQL 5.7对于InnoDB存储引擎的临时表空间做了优化。在MySQL 5.7之前,INNODB引擎的临时表都保存在ibdata里面,而ibdata的贪婪式磁盘占用导致临时表的创建与删除对其他正常表产生非常大的性能影响。在MySQL5.7中,对于临时表做了下面两个重要方面的优化:

MySQL 5.7 把临时表的数据以及回滚信息(仅限于未压缩表)从共享表空间里面剥离出来,形成自己单独的表空间,参数为innodb_temp_data_file_path。

在MySQL 5.7 中把临时表的相关检索信息保存在系统信息表中:information_schema.innodb_temp_table_info. 而MySQL 5.7之前的版本想要查看临时表的系统信息是没有太好的办法。

需要注意的一点就是,虽然INNODB临时表有自己的表空间,但是目前还不能自己定义临时表空间文件的保存路径,只能是继承innodb_data_home_dir。此时如果想要拿其他的磁盘,比如内存盘来充当临时表空间的保存地址,只能用老办法,做软链。举个小例子:

我现在用的OS是 Ubuntu12.X,想用tmpfs文件系统充当临时表空间,

root@ytt-master-VirtualBox:/usr/local/mysql/data# ln -s/run/shm/ /usr/local/mysql/data/tmp_space2

root@ytt-master-VirtualBox:/usr/local/mysql/data#ls -l | grep 'shm'

lrwxrwxrwx1 root root 9 Nov 13 10:28tmp_space2 -> /run/shm/

然后把

innodb_temp_data_file_path=tmp_space2/ibtmp2:200M:autoextend

添加到my.cnf里的[mysqld]下面一行, 重启MySQL服务后:

mysql>select @@innodb_temp_data_file_path\G

***************************1. row ***************************

@@innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend

1 rowin set (0.00 sec)

先写一个批量创建临时表的存储过程:

DELIMITER$$

USE`t_girl`$$

DROPPROCEDURE IF EXISTS `sp_create_temporary_table`$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `sp_create_temporary_table`(

IN f_cnt INT UNSIGNED )

BEGIN

DECLARE i INT UNSIGNED DEFAULT 1;

WHILE i <= f_cnt

DO

SET @stmt = CONCAT('create temporarytable tmp',i,' ( id int, tmp_desc varchar(60));');

PREPARE s1 FROM @stmt;

EXECUTE s1;

SET i = i + 1;

END WHILE;

DROP PREPARE s1;

END$$

DELIMITER;

现在来创建10张临时表:

mysql>call sp_create_temporary_table(10);

QueryOK, 0 rows affected (0.07 sec)

如果在以前,我们只知道创建了10张临时表,但是只能凭记忆或者手工记录下来临时表的名字等信息。

现在可以直接从数据字典里面检索相关数据。

mysql> select * frominformation_schema.innodb_temp_table_info;

+----------+--------------+--------+-------+----------------------+---------------+

|TABLE_ID | NAME | N_COLS | SPACE| PER_TABLE_TABLESPACE | IS_COMPRESSED |

+----------+--------------+--------+-------+----------------------+---------------+

| 56 | #sql1705_2_9 | 5 | 36 | FALSE |FALSE |

| 55 | #sql1705_2_8 | 5 | 36 | FALSE |FALSE |

| 54 | #sql1705_2_7 | 5 | 36 | FALSE |FALSE |

| 53 | #sql1705_2_6 | 5 | 36 | FALSE |FALSE |

| 52 | #sql1705_2_5 | 5 | 36 | FALSE |FALSE |

| 51 | #sql1705_2_4 | 5 | 36 | FALSE |FALSE |

| 50 | #sql1705_2_3 | 5 | 36 | FALSE |FALSE |

| 49 | #sql1705_2_2 | 5 | 36 | FALSE |FALSE |

| 48 | #sql1705_2_1 | 5 | 36 | FALSE |FALSE |

| 47 | #sql1705_2_0 | 5 | 36 | FALSE |FALSE |

+----------+--------------+--------+-------+----------------------+---------------+

10rows in set (0.00 sec)

功能性我就写到这里,大家性能方面如果有兴趣可以找时间去测试。

mysql临时表空间_MySQL 5.7 深度解析: 临时表空间相关推荐

  1. mysql创建临时表 分页_Mysql 如何创建一张临时表

    mysql 利用 temporary 关键字就可以创建出一个临时表.创建的这张表会在与服务器的会话终止时自动消失 语法:create temporary table tbl_name...; 规则:每 ...

  2. mysql 回收空间_MySQL表的碎片整理和空间回收小结

    MySQL表碎片化(Table Fragmentation)的原因 关于MySQL中表碎片化(Table Fragmentation)产生的原因,简单总结一下,MySQL Engine不同,碎片化的原 ...

  3. 老男孩mysql参数配置_MySQL启动相关参数解析

    1.basedir = /usr/local/mysql 代表MySQL安装路径 2.datadir = /usr/local/mysql/data 代表MySQL的数据文件路径 3.port = 3 ...

  4. mysql binlog c++_MySQL binlog的格式解析

    我搜集到了一些资料,对理解代码比较有帮助. 在头文件中binlog_event.h中,有描述 class Log_event_header class Log_event_footer 参见[Myst ...

  5. mysql将查询结果作为临时表查询_mysql使用查询结果作为临时表

    (一)select查询作为临时表 select cou,name from (select count(*) AS cou,enabled AS name from `user` group by e ...

  6. mysql truncate 释放空间_mysql truncate table未释放表空间磁盘空间

    truncate table tablename; 该命令可以清空一个表里的所有数据,并归1自增ID的值. 但myisam的表和innodb的表在使用上有一定的区别. myisam表会清空所有数据,并 ...

  7. mysql v8 漏洞_mysql'密码安全 - osc_v8gts6gd的个人空间 - OSCHINA - 中文开源技术交流社区...

    MYSQL数据库的安全配置 MYSQL密码的修改与恢复 MYSQL数据库密码的修改 Mysql5.7以下默认root登录密码为空,安装完成之后首先需要修改root的登录密码. # mysqladm – ...

  8. mysql 树排序_mysql按树深度排序

    我有表'pe'与列id,名称和lcltyid我有表'wp_exrz_locality_localities'与id,name和parent locality表是树,父级包含另一个位置行的id . pe ...

  9. mysql部署练习_MySQL主从练习 - osc_b9r67jnt的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.按照1核CPU.4G内存.40G硬盘创建两台名为node-1和node-2的云主机. 2.在公有云中完成一个名为intnetX的内部网络为192.168.X.0的云主机网络区域配置,将该网络网关设 ...

最新文章

  1. 用python画小猪佩奇(非原创)
  2. 元学习—Meta Learning的兴起
  3. js控制input框输入数字时,累计求和
  4. Spring Security之短信登录
  5. 使用C#读写结构化的二进制文件
  6. ai 中 统计_AI统计(第2部分)
  7. 如何提升员工体验 助力企业业务增长?这个棘手的问题终于被解决了!
  8. 面向人工智能“新基建”的知识图谱行业白皮书
  9. MySQL(一)存储引擎
  10. 《InsideUE4》GamePlay 架构(二)Level 和 World
  11. window消息机制
  12. mysql 数据库取前后几秒 几分钟 几小时 几天的语句
  13. 一阶广义差分模型_微波射频差分探针去嵌入理论研究
  14. python爬虫--requests模块
  15. CCF专区推荐重点SCI期刊征稿中~
  16. BT.2020 新一代超高清UHD视频制作与显示系统标准
  17. 超清楚!麦克风阵列学习笔记(一)——线性麦克风阵列的时间延迟Beamforming算法(Time-Delay Beamforming of Microphone ULA Array)
  18. 用python做youtube自动化下载器!附完整代码!
  19. 物联网与嵌入式是什么关系
  20. C#指定图片添加文字——修改版

热门文章

  1. 操作系统 —— 磁盘
  2. java 数据库 事务 只读_java – odd SQLException – 无法检索转换只读状态服务器
  3. python弹球小游戏程序_Python实现弹球小游戏
  4. 新计算机无法 盘启动不了,U盘无法被电脑识别导致制作U盘启动盘失败怎么办?...
  5. php知识点_PHP那些琐碎的知识点(整理)
  6. python刷题+leetcode(第二部分)
  7. Fater R-CNN 整体把握
  8. RxJava学习入门
  9. 自定义view实现水波纹效果
  10. Dom4j完整教程~属性相关