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

临时表

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

临时表有下面几种:

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
, 表空间
, mysql5.7
, 临时表性能
, 临时表空间
5.7
mysql 临时表空间不足、mysql 临时表空间、mysql 查看临时表空间、mysql 临时表空间大小、mysql 默认临时表空间,以便于您获取更多的相关知识。

时间: 2025-01-20 19:36:43

深度解析MySQL 5.7之临时表空间_Mysql的相关文章

深度解析MySQL 5.7之中文全文检索_Mysql

前言 其实全文检索在MySQL里面很早就支持了,只不过一直以来只支持英文.缘由是他从来都使用空格来作为分词的分隔符,而对于中文来讲,显然用空格就不合适,需要针对中文语义进行分词.这不,从MySQL 5.7开始,MySQL内置了ngram全文检索插件,用来支持中文分词,并且对MyISAM和InnoDB引擎有效. 在使用中文检索分词插件ngram之前,先得在MySQL配置文件里面设置他的分词大小,比如, [mysqld] ngram_token_size=2 这里把分词大小设置为2.要记住,分词的S

解析mysql中的auto_increment的问题_Mysql

今儿在逛论坛时,发现一个看似很简单的问题,却引起了大家的广泛关注:这是一道很早的面试题:一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 .答案: 如果表的类型是MyISAM,那么是18. 因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失. 如果表的类型是InnoDB,那么是15. InnoDB表只是把自增主键的最大ID记录到内存

解析mysql与Oracle update的区别_Mysql

update :单表的更新不用说了,两者一样,主要说说多表的更新 复制代码 代码如下:        Oracle> Oracle的多表更新要求比较严格,所以有的时候不是很好写,我们可以试试Oracle的游标        update (        select t.charger_id_ new_charger_id_         from t_cus_year_status t         left join t_customer_infos cus on cus.id_ =

解析Mysql多表查询的实现_Mysql

查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看.Mysql多表查询: 复制代码 代码如下: CREATE TABLE IF NOT EXISTS contact( contact_id int(11) NOT NULL AUTO_INCREMENT, user_name varchar(255), nom varchar(255), prenom varchar(255), mail varchar(64), passcode

解析mysql不重复字段值求和_Mysql

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的.所以我花了很多时间来研究这个问题,网上也查不到解决方案..下面先来看看例子:  

MySQL 5.7怎么爬出临时表空间的坑

如何确认临时表是由哪个用户连接创建的? 上次我们介绍了MySQL 5.7临时表空间怎么玩才能不掉坑里,这次我们来介绍如何确认是哪个用户连接创建的临时表,以及如何释放临时表. 首先,我们查看当前的连接ID: yejr@imysql.com>SELECT CONNECTION_ID(); +-----------------+ | CONNECTION_ID() | +-----------------+ | 2470 | +-----------------+ 在当前会话中创建临时表: yejr@

PostgreSQL和MySQL的存储层深度解析

PostgreSQL和MySQL的存储层深度解析 李海翔  DTCC2014 PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS).PostgreSQL支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询.外键.触发器.视图.事务完整性.MVCC.同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型.函数.操作符.聚集函数.索引免费使用.修改.和分

oracle临时表空间大量占用问题的处理

一个电信运营商客户的核心交易系统,临时表空间大量被占用,临时表空间被撑到了600GB.这样的问题复杂吗?取决于很多因素,不过今天所要讲的案例,并不复杂,如果我们对临时表空间在何种情况下使用有足够了解. 首先,我们要去检查是什么会话占用了临时表空间,具体占用了多少,临时段的具体类型是什么.正如我们要想知道这个月的花费过大,去分析原因时就要去看是哪些开销过大.开销了多少金额.开销的用途等. 这个步骤比较简单,查询v$sort_usage就可以了: view plaincopy to clipboar

Kafka深度解析

[本文转自于Kafka深度解析] 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐率.即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输 同时支持离线数据处理和实时数据处理 为什么要用消息系统 解耦 在项目启动之初来预测将来项目