快捷搜索:  汽车  科技

mysql怎么使用临时表(MySQL临时表)

mysql怎么使用临时表(MySQL临时表)临时表对主备复制的影响2.从5.7开始,引入一个临时文件表空间,专门用来存放临时文件的数据,无需再创建ibd文件了。1.普通表的table_def_key值是“库名 表名”;2.临时表table_def_key在“库名 表名”基础上又加入了“server_id thread_id”,所以同一session下临时表名可以和普通表名相同;同时也能解决主备复制不同session临时表同名问题。

mysql怎么使用临时表(MySQL临时表)(1)

临时表在使用上的几个特点:

  • 建表语法 create temporary table ...;
  • 一个临时表只能被创建它的session访问,对其他线程不可见;
  • 临时表名可以与普通表相同;
  • 一个session内有同名的临时表和普通表时,show create table 语句,以及增删改查语句(查询语句)访问的是临时表;
  • show tables 命令不显示临时表;
  • session结束时,会自动删除session内的临时表。

临时表的应用

  • 复杂查询的优化过程(典型应用场景:分库分表系统的跨库查询)

为什么临时表可以重名

  • 临时表结构存储:InnoDB表通过创建一个frm文件保存表结构定义,通过select @@tmpdir可以找到保存目录;它的命名规则是“#sql{进程 id}_{线程 id}_序列号”
  • 临时表数据存储:

1.5.6及之前的版本,在MySQL临时文件目录下创建一个同frm文件相同前缀、以.ibd为后缀的文件,存放数据文件;

2.从5.7开始,引入一个临时文件表空间,专门用来存放临时文件的数据,无需再创建ibd文件了。

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

1.普通表的table_def_key值是“库名 表名”;

2.临时表table_def_key在“库名 表名”基础上又加入了“server_id thread_id”,所以同一session下临时表名可以和普通表名相同;同时也能解决主备复制不同session临时表同名问题。

  • 每个线程都有自己的临时表链表,每次session内操作表的时候,先遍历链表,检查是否有这个名字的临时表,如果有就优先操作临时表,如果没有再操作普通表;在session结束时对链表里的每个临时表,执行“DROP TEMPORARY TABLE 表名”的操作。

临时表对主备复制的影响

  • 在binlog_format=statement/mixed的时候,临时表的操作会记录到binlog中;在binlog_format=row时,跟临时表有关的语句不会被记录到binlog中。
  • 在statement/mixed格式下,创建临时表的语句会传到备库执行,备库的同步线程会创建这个临时表。主库在线程退出的时候,会自动删除临时表,但是备库同步线程是持续进行的。所以这个时候需要在主库上写一个DROP TEMPORARY TABLE 传给备库执行。
  • 在binlog_format=row时,如果删除主库上的临时表,那么在传给备库之前,会将删除临时表的命令删除,并改写语句加上/* generated by server */ 说明了这是一个被服务端改写过的命令

猜您喜欢: