我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL之临时表

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL之临时表

写在前面

本文一起看下MySQL的临时表。

1:什么是临时表

通过create temporary table t语句创建的表,就是临时表,临时表的临时体现在其生命周期是和会话一样的,当会话结束,即连接关闭时MySQL会自动将创建的临时表执行删除操作,如下:

mysql> create temporary table t_tmp(age int)engine=innodb;Query OK, 0 rows affected (0.07 sec)mysql> show create table t_tmp;+-------+----------------------------------------------------------------------------------------------------+| Table | Create Table   |+-------+----------------------------------------------------------------------------------------------------+| t_tmp | CREATE TEMPORARY TABLE `t_tmp` (  `age` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 |+-------+----------------------------------------------------------------------------------------------------+1 row in set (0.03 sec)

虽然临时表的生命周期是会话级别的,但是在程序中显式的删除临时表永远是一个我们必须要做的动作(删除也是使用drop table语句如:drop table t_tmp;),因为你不能保证任何场景下你所创建的临时表都会被合理的删除,比如使用线程池时,此时就不仅仅是临时表没有被删除而占用资源的问题了,还会因为后续的程序读取到前面程序在临时表中的数据,而造成bug,而且这种bug是很难发现的。所以,养成好习惯是很重要的。

2:临时表和内存表

  • 内存表
    内存表指的是存储引擎为memory的表,建表语句是create table t()engine=memory,数据是保存在内存中的,因此如果是重启的话,数据不会保留,但表结构是保留的,可以看到,内存表就是正常的表,只不过是存储引擎为memory,且重启后数据不会保留,如下测试:
mysql> create table t_memory(id int primary key auto_increment)engine=memory;Query OK, 0 rows affected (0.08 sec)mysql> insert into t_memory value();Query OK, 1 row affected (0.04 sec)mysql> select * from t_memory;+----+| id |+----+|  1 |+----+1 row in set (0.01 sec)// 重启[root@localhost tmp]# service mysql restartShutting down MySQL............. SUCCESS! Starting MySQL................................................................. SUCCESS! // 重启后查看mysql> show create table t_memory;+----------+-----------------------------------------------------------------------------------------------------------------------------+| Table    | Create Table|+----------+-----------------------------------------------------------------------------------------------------------------------------+| t_memory | CREATE TABLE `t_memory` (  `id` int(11) NOT NULL AUTO_INCREMENT,  PRIMARY KEY (`id`)) ENGINE=MEMORY DEFAULT CHARSET=utf8 |+----------+-----------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)mysql> select * from t_memory;Empty set (0.00 sec)
  • 临时表
    可以是任何存储引擎,但是生命周期和会话绑定,并且不同会话可以创建相同名称的临时表,具体我们在后面继续来分析。

3:临时表的特点

为了便于理解,我们来看下下面这个操作序列:
在这里插入图片描述

总结其特点如下:

1:语法是create temporary table ...2:临时表在会话之间是隔离的,即本会话只能看到本会话内创建的临时表3:临时表可以和普通表同名4:操作时,存在同名的临时表和普通表时,临时表的优先级高于普通表5:show tables不会显示临时表,只显示普通表6:不同会话可以创建同名的临时表

其中的特点6:不同会话可以创建同名的临时表当我们在实际业务代码中需要使用中间表的业务中就非常有用了,比如在分库分表场景中聚合不同库和表的数据,此时如果是使用普通表,那么不同的会话并行操作时肯定会出现表名称重复的问题,而使用临时表则会很好的解决这个问题。

4:为什么临时表是可以重名的

从前面的分析中我们知道了,不同的会话临时表名称是可以重复的,这是为什么呢?要解释这个问题,必须先来了解下,MySQL是如何判断表是否存在?,每个表都有一个对应的table_def_key,对于普通表table_def_key的定义是库名+表名,因此普通表的表名称不可以重复,而临时表table_def_key的规则是库名+表名+server_id+thread_id,而其中thread_id,每个会话连接都是不一样的,所以,临时表是可以重名的,那么当我们执行语句create temporary table tttt(age int(32))engine=innodb;之后临时表tttt的结构和数据都是如何存储的呢?对于结构是在select @@tmpdir目录下创建名称为#sql{进程 id}_{线程 id}_序列号.frm的文件,如下:

[root@localhost tmp]# mysql -uroot -p -e"select @@tmpdir"Enter password: +----------+| @@tmpdir |+----------+| /tmp     |+----------+[root@localhost tmp]# pwd/tmp[root@localhost tmp]# ll | egrep '#sql'-rw-r----- 1 mysql mysql    8558 Sep  2 16:50 #sql105b4_3_0.frm

数据的存放,在5.7之前是在select @@tmpdir目录下创建一个相同前缀的.ibd文件,5.7之后引入了临时文件表空间,数据就存放在这里,就不需要生成ibd文件了。

写在后面

参考文章列表:

MySQL 临时表

来源地址:https://blog.csdn.net/wang0907/article/details/126667792

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL之临时表

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL之临时表

写在前面 本文一起看下MySQL的临时表。 1:什么是临时表 通过create temporary table t语句创建的表,就是临时表,临时表的临时体现在其生命周期是和会话一样的,当会话结束,即连接关闭时MySQL会自动将创建的临时表执
2023-08-17

MySQL临时表

外部临时表是通过语句create temporary table...创建的临时表,临时表只在本会话有效,会话断开后,临时表数据会自动清理。 内部临时表主要有两类,一类是information_schema中临时表,另一类是会话执行查询时,如果执行计划中包含有
MySQL临时表
2019-07-13

MySQL怎么建临时表

在MySQL中,可以使用CREATE TEMPORARY TABLE语句来创建临时表。临时表是一种只在当前会话有效的表,它的数据仅在当前连接有效,连接断开时表将自动删除。临时表的表结构和普通表一样,可以包含多个列和索引。以下是创建临时表
2023-10-27

MySQL优化临时表使用

MySQL优化临时表的使用可以从以下几个方面进行:选择合适的存储引擎:MySQL支持多种存储引擎,如InnoDB、MyISAM等。对于临时表,建议使用InnoDB存储引擎,因为它支持行级锁定,事务处理和更高级别的数据完整性保证。合理设置临时
MySQL优化临时表使用
2024-10-20

如何删除MySQL临时表?

我们知道,如果当前会话终止,MySQL 临时表将被删除。但仍然在会话之间我们想要删除临时表,而不是借助 DROP 语句我们可以删除临时表。可以借助以下示例来理解 -示例在此例如,我们正在删除名为“SalesSummary”的临时表 -mys
2023-10-22

MySQL查询优化临时表

【理论分析】MySQL在执行SQL查询时可能会用到临时表,一般情况下,用到临时表就意味着性能较低。临时表存储MySQL临时表分为“内存临时表”和“磁盘临时表”,其中内存临时表使用MySQL的MEMORY存储引擎,磁盘临时表使用MySQL的MyISAM存储引擎;
2019-09-24

MySQL临时表满了/临时表空间耗尽的解决方法

目录解决办法在 mysql 中,当你收到“临时表满了”的警报时,通常意味着 MySQL 在处理查询时创建的临时表空间已经耗尽。这可能会导致查询失败或性能下降。临时表通常用于处理一些需要排序、分组、或者使用临时数据存储
MySQL临时表满了/临时表空间耗尽的解决方法
2024-08-14

MySQL中的临时表与内存表

临时表和内存表均为MySQL中用于存储特定会话或查询结果的表。临时表由特定会话创建并自动删除,而内存表存储在服务器内存中,数据不持久化。临时表仅对创建它们的会话可见,而内存表对所有会话可见。临时表数据在会话结束时删除,而内存表数据在服务器重启或崩溃时丢失。临时表性能通常比持久表快,而内存表提供最佳性能。临时表用于存储中间查询结果或临时数据,而内存表用于存储经常访问的数据。在选择临时表还是内存表时,需要考虑持久性、性能、内存使用和表大小等因素。
MySQL中的临时表与内存表
2024-04-02

mysql什么时候创建临时表

MySQL中临时表在以下情况下被创建:1、当执行包含“CREATE TEMPORARY TABLE”语句时,会创建一个临时表,只在当前的数据库连接中存在,并且在连接关闭后会自动删除;2、当执行一些复杂的查询或排序操作时,MySQL可能会在内
2023-07-28
2024-04-02

编程热搜

目录