深度解析MySQL 5.7之临时表空间

 更新时间:2016年12月19日 10:55:48   作者:杨涛涛  
尽管临时表在实际在线场景中很少会去显式使用,但在某些运维场景还是需要到的,在MySQL5.7中,专门针对临时表做了些优化,下面这篇文章我们来一起深入的解析MySQL 5.7之临时表空间,有需要的朋友们可以参考借鉴,下面来一起看看吧。

临时表

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

临时表有下面几种:

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中怎样返回一个数据库的所有表名,列名数据类型备注
    2010-04-04
  • MySql增量恢复的几种实现方法

    MySql增量恢复的几种实现方法

    本文主要介绍了MySql增量恢复的几种实现方法,通过增量备份与恢复,可以在系统发生故障或数据损坏时快速恢复到最新状态,提高系统的可靠性和可用性,感兴趣的可以了解一下
    2023-08-08
  • 解决从集合运算到mysql的not like找不出NULL的问题

    解决从集合运算到mysql的not like找不出NULL的问题

    这篇文章主要介绍了解决从集合运算到mysql的not like找不出NULL的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • MySQL慢查询优化之慢查询日志分析的实例教程

    MySQL慢查询优化之慢查询日志分析的实例教程

    这篇文章主要介绍了MySQL慢查询日志分析的实例教程,通过设置参数从慢查询日志开始分析性能问题的原因,需要的朋友可以参考下
    2015-11-11
  • 浅谈MySQL中的group by

    浅谈MySQL中的group by

    这篇文章主要介绍了MySQL中的group by,MySQL的group by用于对查询的数据进行分组;此外MySQL提供having子句对分组内的数据进行过滤。下面来看看文章对此的具体介绍,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11
  • MySQL同步ES的五种方案及对比详解

    MySQL同步ES的五种方案及对比详解

    有些小伙伴在工作中可能遇到过数据库查询慢的问题,特别是模糊查询和复杂聚合查询,这时候引入ES(Elasticsearch)作为搜索引擎是个不错的选择,所以本文给大家介绍了MySQL同步ES的五种方案,需要的朋友可以参考下
    2025-09-09
  • MySQL外键约束(FOREIGN KEY)案例讲解

    MySQL外键约束(FOREIGN KEY)案例讲解

    这篇文章主要介绍了MySQL外键约束(FOREIGN KEY)案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 后端服务器中如何实现MySQL数据库操作接口

    后端服务器中如何实现MySQL数据库操作接口

    文章主要介绍了如何在Node.js中使用mysql模块连接MySQL数据库,并通过Express框架实现数据库操作接口,前端可以通过Axios库与后端进行交互,实现数据操作
    2024-11-11
  • 教你如何让spark sql写mysql的时候支持update操作

    教你如何让spark sql写mysql的时候支持update操作

    spark提供了一个枚举类,用来支撑对接数据源的操作模式,本文重点给大家介绍如何让spark sql写mysql的时候支持update操作,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-02-02
  • mysql通过ssl的方式生成秘钥具体生成步骤

    mysql通过ssl的方式生成秘钥具体生成步骤

    在my.cnf末尾端设置ssl 参数, 然后重新启动mysql服务即可,通过openssl生成证书的配置, 在mysql db server上生成秘钥,具体步骤如下,感兴趣的朋友可以参考下哈
    2013-06-06

最新评论