外部临时表
本问主要解决如下的问题:
- 临时表为什么能重名
- 什么情况下使用临时表
临时表和引擎是Mermory表的区别
- 首先内存表的数据是保存到内存中的,当数据库关闭后数据会消失,只保留表结构。
- 而临时表是可以指定任意表引擎的,且临时表和当前Mysql的htread现关,当一个session关闭后临时表会被删掉。
- 不同session的临时表可以重名
为什么临时表能重名
临时表是和当前的线程相关:
- Mysql5.6包含5.6之前,Mysql会在临时文件目录下建立一个”前缀.ibd”的文件,用来存放数据文件
- Mysql5.7之后的版本,引入了一个临时表空间,专门用来存放练市文件,不需要在创建ibd文件了。
- 前缀是:库名+表名+serverid名+线程id。
Mysql每个名都有一个def_table_name,临时表的表明就是”库名+表名+serverid名+线程id”,所以不同线程之间的临时表是可以重名的。
注:innodb类型的临时表会在临时文件目录下,文件名的是#sql{进程 id}+{线程 id}+序列号,语句如下:
1 | create temporary table temp_t(id int primary key)engine=innodb; |
如何使用临时表
1 |
|
mysql每个库都维护一个表名的链表,临时表排在前面,查找表名时候会轮训链表,发现表名对应的表是临时表时候会优先使用临时表。
临时表的使用场景
分库分表:比如我们按照字段对一个表进行分库分表,当有一个查询条件不是按照分表规则进行查询时候有俩种解决方法
- proxy来做聚合
- 通过临时表聚合
临时表的主备库处理
- 当binlog格式是state时候,主从同步时候要把临时表涉及的binglo都同步过去
- 如果是row格式则不用。
- 另外删除临时表的binlog会在一条语句中完成,所以只有drop语句binlog会格式化,crud的语句statement会原封不懂的传递给从库