临时表
内存表和临时表的区别
- 内存表:是用memory引擎的表,这表的数据都放在内存中,重启时会清空数据,但是表结构还在
- 临时表:可以使用各种引擎,如果使用innodb或myisam的话,数据是存到磁盘的,
临时表的特性
- 不同session的临时表是可以重名的,有多个session同时创建临时表,并不会因为名字一样而冲突,因为是session级别的(线程独有)
- 不需要担心数据问题,当断开连接或异常重启的时候,临时表会自动被回收
临时表的应用
- 分库分表的情况下,用proxy,然后如果使用到每个分区都需要涉及的数据,那就要在汇总的节点,创建临时表接受各个分库来的数据,进行汇总排序等操作,如果哪个分节点资源空闲太多,也可以把这操作放在那个分节点上
临时表的重名
- 当创建临时表时,innodb会创建一个frm后缀文件在临时文件目录来存储表结构,前缀是“#sql{进程 id}{线程 id} 序列号”。你可以使用 select @@tmpdir 命令,来显示实例的临时文件目录
数据存储方式
- 在5.7之前,会在临时文件目录下面创建一个前缀一样,后缀为.ibd的文件,来存储数据,
- 5.7之后,mysql引入了一个临时文件表空间,专门存临时数据,不用再建文件
临时表的日志
- 如果binlog设置的row,则不会记录临时表的操作
- 如果使用binlog是statment/mixed的话,那么临时表的操作都会被记录到log文件里面,如果到备库里面,这个log会以库名+serverId+threadId来区别(所以同名也没事)