36 | 为什么临时表可以重名?
该思维导图由 AI 生成,仅供参考
临时表的特性
- 深入了解
- 翻译
- 解释
- 总结
临时表在MySQL中具有独特的特性,适合于复杂查询优化和分库分表系统中的应用。与内存表不同,临时表可以使用各种引擎类型,包括InnoDB和MyISAM引擎,且可以与普通表同名。由于临时表只能被创建它的session访问,对其他线程不可见,并且在session结束时会自动删除,因此特别适合于避免表名重复导致建表失败的问题和不需要额外的数据清理操作。临时表经常被用于复杂查询的优化过程中,尤其在分库分表系统的跨库查询中发挥重要作用。文章还介绍了临时表的存储机制和命名规则,解释了为什么不同线程可以创建同名的临时表。总体而言,临时表的特性和应用使其成为MySQL中一个重要的技术工具。 在实际应用中,临时表一般用于处理比较复杂的计算逻辑。由于临时表是每个线程自己可见的,所以不需要考虑多个线程执行同一个处理逻辑时,临时表的重名问题。在线程退出的时候,临时表也能自动删除,省去了收尾和异常处理的工作。在binlog_format='row'的时候,临时表的操作不记录到binlog中,也省去了不少麻烦,这也可以成为你选择binlog_format时的一个考虑因素。 需要注意的是,我们上面说到的这种临时表,是用户自己创建的,也可以称为用户临时表。与它相对应的,就是内部临时表,在中我已经和你介绍过。 总的来说,临时表在MySQL中的应用非常灵活,能够解决复杂查询和分库分表系统中的问题,同时也减少了一些数据处理的繁琐工作。
《MySQL 实战 45 讲》,新⼈⾸单¥68
全部留言(48)
- 最新
- 精选
- 辣椒老师,不同线程可以使用同名的临时表,这个没有问题。但是如果在程序中,用的是连接池中的连接来操作的,而这些连接不会释放,和数据库保持长连接。这样使用临时表会有问题吗?。
作者回复: 会,“临时表会自动回收”这个功能,主要用于“应用程序异常断开、MySQL异常重启”后,不需要主动去删除表。 而平时正常使用的时候,用完删除,还是应该有的好习惯。😆 好问题,新年快乐~
2019-02-073204 - 老杨同志新年快乐,老师好勤奋! 有个问题,insert into select语句好像会给select的表加锁,如果没有索引,就锁全表,是不是这样?什么时候可以大胆的用这类语句?
作者回复: 新年好! “insert into select语句好像会给select的表加锁,如果没有索引,就锁全表”,是的。 这类最好不要很大胆😆,如果不是业务急需的,从源表导出来再写到目标表也是好的。 后面第40篇会说到哈。
2019-02-04563 - 天王临时表建表语法create temporary table ,和普通的表不一样,和内存表也不一样。内存表数据保存到内存里,重启会丢失,临时表会写入到磁盘。临时表只对自己的session中可见,session结束后自动删除表结构和表数据。适用场景是分库分表,查询到的数据在临时表中做聚合。临时表可以重名,实际的存储文件名有线程id,在内存中表的命名有table_ref_key,是由库名加表名加serverid+线程id组成。bin log设置为row模式,临时表不会同步到备库中,设置为statement模式,会同步到备库中。
作者回复: 👍
2019-02-26357 - Carisy老师有个问题,如果说创建临时表在主库,查询的时候打到从库上,查询是不是就有问题了,查询主库的线程id跟从库不一致
作者回复: 是的,所以一般一个事务创建临时表以后,读写分离就会默认接下来的请求都路由到主库去了
2020-05-18244 - poppy老师,新年快乐。 关于思考题,alter table temp_t rename to temp_t2,我的理解是mysql直接修改的是table_def_key,而对于rename table temp_t2 to temp_t3,mysql直接去mysql的data目录下该数据库的目录(例如老师实验用的应该是test数据库,所以对应的是test目录)下寻找名为temp_t2.frm的文件去修改名称,所以就出现了"Can't find file './test/temp_t2.frm'(errno: 2 - No such file or directory)
作者回复: 春节快乐 👍
2019-02-0439 - 鸠翱放假结束该补课了😅 评论区有个回答说到了连接池的问题问到会不会有问题……而老师您回答的是会有问题 可是临时表在session结束后不就删除了嘛 那么即使是用同一个线程又有什么问题呢?
作者回复: 是这样的,要看连接池怎么实现。 如果A客户端在执行过程中创建了临时表,用完了连接就放回池子里面,没有做别的清理工作,然后新的客户端B复用这个连接,就可能会看到A的临时表
2019-02-12225 - 亮老师您好,在25课里面的置顶留言“6.表上无主键的情况(主库利用索引更改数据,备库回放只能用全表扫描,这种情况可以调整slave_rows_search_algorithms参数适当优化下)” 为啥会存在无主键的表呢,就算dba没创建主键,Innodb可以用rowid给自动建一个虚拟主键呀,这样不就是所有的表都有主键了吗?
作者回复: 用户没有显示指定主键的话,InnoDB引擎会自己创建一个隐藏的主键,但是这个主键对Server层是透明的,优化器用不上。 新年快乐~
2019-02-0421 - undifined老师 有几个问题 1. 在 session 结束的时候会执行 DROP TEMPORARY TABLE,如果数据库掉电,这个临时表什么时候会被清除 2. 如果binlog 中记录了临时表的操作,因为 session 不同,在从库中访问不到,这样做的意义是什么 辛苦老师解答一下,谢谢老师
作者回复: 1. 好问题,重启以后MySQL会扫描临时目录,把表都删掉; 2. 就是我们文中说的,如果binlog是statement的时候,也需要同步到备库去,否则备库上执行一个 insert into t_normal (select * from t_temp) 就会报错了
2019-02-11312 - 布衣骇客错过得还是得补上,新得一年,新的开始,加油
作者回复: 新年快乐,加油💪
2019-02-116 - 亮老师过年好呀,祝您猪年大吉,财源广进;老师咱们这个课结束后,再开一期好不好啊,没学够啊,这是我的新年愿望哦
作者回复: 新年快乐,共同进步😄
2019-02-046