定义
内存表,指的是使用 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讲
部分内容来自网络,如有侵权请联系作者删除。