暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL tips(二十一)——临时表

爱可可的人生记录仪 2020-02-10
143
最近几天和好友久违的开起了黑,虽然没有了大学宿舍的那种味道,但却是一种难得的享受,尤其是当前病毒肆虐的环境下。今天开始收收心,17号就要正式上班了,该把丢掉的状态找回来了。

定义

内存表,指的是使用 Memory 引擎的表,建表语法是 create table … engine=memory。这种表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在。

临时表,可以使用各种引擎类型 。如果是使用 InnoDB 引擎或者 MyISAM 引擎的临时表,写数据的时候是写到磁盘上的。当然,临时表也可以使用 Memory 引擎。


临时表特性

1.建表语法是 create temporary table …。

2.一个临时表只能被创建它的 session 访问,对其他线程不可见。

3.临时表可以与普通表同名

4.session 内有同名的临时表和普通表的时候,show create 语句,以及增删改查语句访问的是临时表。session 结束的时候,会自动删除临时表。

5.show tables 命令不显示临时表。


临时表的应用

由于不用担心线程之间的重名冲突,临时表经常会被用在复杂查询的优化过程中。分库分表系统的跨库查询就是一个典型的使用场景。


为什么临时表可以重名?

MySQL 维护数据表,除了物理上要有文件外,内存里面也有一套机制区别不同的表,每个表都对应一个 table_def_key。

一个普通表的 table_def_key 的值是由“库名 + 表名”得到的,所以如果你要在同一个库下创建两个同名的普通表,创建第二个表的过程中就会发现 table_def_key 已经存在了。而对于临时表,table_def_key 在“库名 + 表名”基础上,又加入了“server_id+thread_id”。


临时表和主备复制

如果当前的 binlog_format=row,那么跟临时表有关的语句,就不会记录到 binlog 里。

MySQL 在记录 binlog 的时候,会把主库执行这个语句的线程 id 写到 binlog 中。这样,在备库的应用线程就能够知道执行每个语句的主库线程 id,并利用这个线程 id 来构造临时表的 table_def_key。


需要注意的是,上面说到的这种临时表,是用户自己创建的 ,也可以称为用户临时表。与它相对应的,就是内部临时表。


参考资料:丁奇,MySQL实战45讲



部分内容来自网络,如有侵权请联系作者删除。


文章转载自爱可可的人生记录仪,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论