视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
深度解析MySQL5.7之临时表空间
2020-11-09 20:42:24 责编:小采
文档


临时表

临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。

临时表有下面几种:

1、全局临时表

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

2、会话级别临时表

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

3、事务级别临时表

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

4、检索级别临时表

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

MySQL 5.7之临时表空间

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

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

2、在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)

总结

功能性我就写到这里,大家性能方面如果有兴趣可以找时间去测试。希望本文的内容对大家学习或者使用mysql5.7能带来一定的帮助,如果有疑问大家可以留言交流。

您可能感兴趣的文章:

  • MySQL中临时表的基本创建与使用教程
  • MySQL中关于临时表的一些基本使用方法
  • MySQL两种临时表的用法详解
  • MySQL使用临时表加速查询的方法
  • 解析Mysql临时表及特点
  • 浅谈MySQL临时表与派生表
  • mysql复制中临时表的运用技巧
  • MySQL中Update、select联用操作单表、多表,及视图与临时表的区别
  • MySQL问答系列之什么情况下会用到临时表
  • MySQL 5.7临时表空间如何玩才能不掉坑里详解
  • 关于JDBC与MySQL临时表空间的深入解析
  • mysql临时表用法分析【查询结果可存在临时表中】
  • 下载本文
    显示全文
    专题