//MySQL中的内存临时表//

这两天事情稍微有点多,公众号也停止更新了几天,结果有读者催更了,也是,说明还是有人关注,利己及人,挺好。

今天分享的内容是MySQL中的临时表,对于临时表,之前我其实没有过多的研究,只是知道MySQL在某些特定场景下会使用临时表来辅助进行group by等一些列操作,今天就来认识下临时表吧。

1、首先。临时表是session级别的,当前session创建的表,在其他session中看不到。

session 1:

mysql> create temporary table test3 (id_tmp int)engine=innodb;Query OK, 0 rows affected (0.00 sec)

session 2:

mysql> show create table test3\GERROR 1146 (42S02): Table 'test.test3' doesn't exist

2、临时表在session中,可以和正式的表重名。

mysql> create table test2 (id int)engine=innodb;Query OK, 0 rows affected (0.01 sec)mysql> create temporary table test2 (id_tmp int)engine=innodb;Query OK, 0 rows affected (0.00 sec)

可以看到,创建同名的test2表的时候,并没有出现报错的情况。

3、当数据库中物理表和临时表的时候,使用show create table查看的是临时表的内容:

mysql> show create table test2\G*************************** 1. row ***************************       Table: test2Create Table: CREATE TEMPORARY TABLE `test2` (  `id_tmp` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)

4、临时表drop掉之后,show create table查看的是物理表的内容。

mysql> show tables like "test2";+------------------------+| Tables_in_test (test2) |+------------------------+| test2                  |+------------------------+1 row in set (0.00 sec)

mysql> drop table test2;Query OK, 0 rows affected (0.00 sec)

mysql> show tables like "test2";+------------------------+| Tables_in_test (test2) |+------------------------+| test2                  |+------------------------+1 row in set (0.00 sec)

5、show tables命令,不能看到临时表。

6、不同的session中可以创建同名的临时表。

7、临时表保存方法

在MySQL中,使用.frm来保存表结构,而使用.ibd来保存表数据,.frm文件一般是放在tmpdir这个参数指定的目录下面的。台式机windows平台下MySQL的如下:

mysql> show variables like "%tmpdir%";+-------------------+-------------------------------------------------+| Variable_name     | Value                                           |+-------------------+-------------------------------------------------+| innodb_tmpdir     |                                                 || slave_load_tmpdir | C:\WINDOWS\SERVIC~1\NETWOR~1\AppData\Local\Temp || tmpdir            | C:\WINDOWS\SERVIC~1\NETWOR~1\AppData\Local\Temp |+-------------------+-------------------------------------------------+3 rows in set, 1 warning (0.01 sec)

MySQL5.6版本下,会生成一个.ibd的文件来保存临时表。

MySQL5.7版本下,引入了临时文件表空间,专门用来存放临时文件的数据。

当我们使用不同的session来创建相同名称的临时表的时候,会发现临时表的目录下面存在不同名称的临时表文件:

这些临时表在内存中是通过链表的方式来表示的,如果一个session中包含两个临时表,MySQL会创建一个临时表的链表,将这两个临时表连接起来,实际的操作逻辑中,如果我们执行了一条SQL,MySQL会遍历这个临时表的链表,检查是否有这个SQL中指定表名字的临时表,如果有临时表,优先操作临时表,如果没有临时表,则操作普通的物理表。

8、临时表在主从复制中的注意点

临时表由于是session级别的,那么在session退出的时候,是会删除临时表的。但是主节点中并没有对临时表进行显示的操作,而是关闭session即可删除,那么从节点如何知道什么时候才能删除临时表呢?

假设主节点进行如下SQL:

crete table tbl;create temporary table tmp like tbl;insert into tmp values (0,0);insert into tbl select * from tmp;

在binlog=statement/mixed模式下,如果不记录临时表相关操作的binlog,则最后一条insert语句会报错。因为找不到tmp这个表。这种情况下,MySQL的binlog中会记录临时表的操作,当主库的session关闭的时候,自动的在binlog中添加drop temporary table的SQL语句,从而保证主从数据的一致。

在binlog=row模式下,跟临时表有关的SQL,都不会记录到binlog里面,因为row模式下,数据的每个字段在binlog中都能找到,针对最后一个insert into select语句,binlog中会记录成往tbl表中插入(0,0)这条记录。

binlog=row模式下,当主库上主动使用drop table tmp的命令来删除临时表的时候,此时因为binlog中不记录临时表的相关操作,所以这条记录也会被忽略。

9、不同线程的同名临时表在从库上如何同时存在?

我们知道临时表是session级别的,而且不同session之间的临时表可以重名,在从库进行binlog回放的时候,从库是如何知道这些重名的临时表分别属于哪个事务的呢?

这个概念的理解可以参考函数中的形参和实参的概念,形参和实参可能有同样的名字,进行赋值的时候,二者的指针值是不一样的,所以同名的参数,对编译器来讲,由于指针值不一样,所以不会出现错误。

MySQL维护数据表,除了物理上要有文件外,内存里面也有一套机制区别不同的表,每个表都对应一个table_def_key。而这个table_def_key的值是由"库名字+表名字+server_id+thread_id"组成的,因为thread_id不同,所以在从库中进行操作的时候,是不会冲突的。

有帮助的话还希望点下再看哈

查看mysql是否内存中读取数据_MySQL中的内存临时表相关推荐

  1. mfc从文件中读取数据_Python 中的 bytes、str 以及 unicode 区别

    从Python发展历史谈起 Python3和Python2表示字符序列的方式有所不同. Python3字符序列的两种表示为byte和str.前者的实例包含原始的8位值,即原始的字节:后者的实例包括Un ...

  2. mysql delete 表关联删除数据_MYSQL中delete删除多表数据与删除关联数据

    在mysql中删除数据方法有很多种,最常用的是使用delete来删除记录,下面我来介绍delete删除单条记 录与删除多表关联数据的一些简单实例. 1.delete from t1 where 条件 ...

  3. mysql 复制表中的数据_MySQL中快速复制数据表方法汇总

    本文将着重介绍两个MySQL命令的组合,它将以原有数据表为基础,创建相同结构和数据的新数据表. 这可以帮助你在开发过程中快速的复制表格作为测试数据,而不必冒险直接操作正在运行 的数据表. 示例如下: ...

  4. mfc从文件中读取数据_Java中Transient关键字,一点课堂(多岸学院)

    Java中Transient关键字 虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的 ...

  5. python从文件中读取数据_Python3 中把txt数据文件读入到矩阵中的方法

    下面为大家分享一篇Python3 中把txt数据文件读入到矩阵中的方法,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 1.实例程序: ''' 数据文件:2.txt内容:(以空格分开每个数据) ...

  6. mysql怎么查找删除重复数据_Mysql中如何查找并删除重复数据

    考试系统中做了一个用户导入试题功能,导致用户导入了很多重复的试题,我需要查询及删除一下重复的记录,于是有了这篇文章. (一)单个字段 1.查找表中多余的重复记录,根据(question_title)字 ...

  7. mysql存储数组类型的数据_mysql中怎么存储数组

    展开全部 SQL没有数组这种类型,数组是一种数据结构的概念,跟关系型mysql数据存储32313133353236313431303231363533e78988e69d833133343362313 ...

  8. mysql查找有小数点的数据_MySQL中查询中位数?

    导读:计算中位数可能是小学的内容,然而在数据库查询中实现却并不是一件容易的事.我们今天就来看看都有哪些方法可以实现. 注:本文所用MySQL版本无限制,所列题目均来源于LeetCode. LeetCo ...

  9. java 从excel中读取数据_java中怎样从Excel中读写数据

    展开全部 public class ReadExcel001 { public static void main(String[] args) { readXml("D:/test.xlsx ...

最新文章

  1. vista系统 金山词霸 不取词翻译
  2. 关于luci的几个问题二
  3. figma下载_通过构建7个通用UI动画来掌握Figma中的动画
  4. HelloSilverlight
  5. C/C++实现删除字符串的首尾空格
  6. 解决 JSP 页面报错 equal symbol expected
  7. 哈维玛德学院 计算机,哈维玛德学院优势多多,令人神往!
  8. centos 安装指定版本的node
  9. iis部署错误:HTTP 错误 500.21 - Internal Server Error
  10. 做品牌 在男人和女人之间玩转巧妙和平衡
  11. android 向上弹出,android 弹出Popupwindow 自适用(Activity或者Dialog)判断向上还向下...
  12. Vue写项目后台SpringBoot 01
  13. 台式电脑桌面没有计算机图标,电脑桌面图标全部消失怎么恢复 电脑桌面图标设置随意放置的方法...
  14. 串口485接法图_RS-485 2线和4线的接法
  15. Matlab中常用矩阵分解
  16. 西门子1500和300哪个贵_西门子s71500与s7300的区别
  17. 跑步装备品牌排行榜,跑步爱好者必备好物推荐
  18. ubuntu相关软件安装
  19. Markdown支持的emoji图标
  20. [Android] ListView 实现隔行变色(二)

热门文章

  1. ruby学习笔记(2)-chomp,chop的区别
  2. Servlet - Upload、Download、Async、动态注册
  3. python学习四(处理数据)
  4. 判断C#中的字符串是否是数字,如果是转换成int类型
  5. mysql手工注入——盲注
  6. Git之签署工具GPG的安装和使用
  7. 【数据结构与算法】之深入解析“三数之和”的求解思路与算法示例
  8. 404. Sum of Left Leaves 左叶子之和
  9. 10.2.3 基本属性
  10. Dictionary Aizu - ALDS1_4_C