36 | 为什么临时表可以重名?

join优化用临时表:有哪些特征,为什么它适合这个场景?

临时表不是内存表

内存表,Memory 引擎,engine=memory。重启清空,表结构还在

临时表,各种引擎类型  。InnoDB或MyISAM 临时表,写到磁盘上。

一、临时表的特性

图 1 临时表特性示例  

1.  建表 create temporary table

2.  只能被创建session 访问其他线程不可见。 A 创建临时表 t, B 不可见

3.  可与普通表同名

4.  show create 及增删改查访问的是临时表

5.  show tables 不显示临时表。

适合join 优化:

1.  不同 session 临时表可重名,多个 session 同时join不需担心表名重复,导致建表失败

2.  不需担心删除问题。普通表异常断开/重启,专门清理中间生成数据表。session 结束自动删除临时表

二、临时表的应用

分库分表跨库查询典型场景:大表 ht,按字段 f,拆分1024 个分表,分布到 32 个数据库

图 2 分库分表简图

一般都中间层 proxy,也有直连

(1)分区 key 以“减少跨库和跨表查询”为依据。大部分语句包含 f 等值条件,f 做分区键。 proxy 解析完 SQL ,确定路由到哪个分表。分表规则(N%1024)

select v from ht  where f=N;

(1)另外索引 k,没用分区字段 f

select v from ht  where k >= M order by t_modified desc limit 100;

思路1:proxy 层代码实现排序

速度,拿到分库数据内存中计算。缺点:

1.  开发工作量大。如 group by, join,中间层开发能力高;

2.   proxy 端压力大内存不够CPU 瓶颈问题。

思路2:汇总表

汇总库创建临时表 temp_ht,包含 v、k、t_modified;各个分库执行

select  v,k,t_modified from ht_x where k >= M order by t_modified desc limit 100;结果插入temp_ht 表中;

select v from  temp_ht order by t_modified desc limit 100; 得结果。

图 3 跨库查询流程示意图

实践每个分库计算量都不饱和,临时表 temp_ht 放到 32 个分库中某个上。查询逻辑与图 3 类似。

三、为什么临时表可重名?

3.1存储区别不同

create temporary  table temp_t(id int primary key)engine=innodb;   //这时创建frm 文件保存表结构

放在临时文件目录下,后缀是.frm,前缀是“#sql{进程 id}_{线程 id}_ 序列号select @@tmpdir 显示临时文件目录。

数据存放方式, MySQL 不同版本中处理方式:

5.6 以及之前的版本里,.ibd 为后缀存放,之后临时文件表空间

t1 的 InnoDB 临时表,MySQL 存储上认为跟普通表 t1 不同,session A 的 id 是 4,session 的线程 id 是 5磁盘上文件不重名

图 4 临时表的表名

3.2 内存区别不同

每个表都对应一个 table_def_key。普通表 table_def_key 值是由“库名 + 表名”得到的,同库下创建同名普通表,第二table_def_key 已存在。

临时表table_def_key 在“库名 + 表名”基础上,加了“server_id+thread_id”。

每个线程维护了自己临时表链表。session 内操作,先遍历链表临时表优先;结束时,对链表里每个临时表,执行 “DROP TEMPORARY TABLE + 表名”,binlog 中也记录 DROP TEMPORARY TABLE 命令。

四、临时表和主备复制

写 binlog,意味备库需要。

create table  t_normal(id int primary key, c int)engine=innodb;/*Q1*/

create temporary  table temp_t like t_normal;/*Q2*/

insert into  temp_t values(1,1);/*Q3*/

insert into  t_normal select * from temp_t;/*Q4*/

如临时表操作不记录,备库只有 create table t_normal 表和 insert into t_normal select * from temp_t 的 binlog 日志,备库执行 insert into t_normal 报“表 temp_t 不存在”。如的binlog_format=row,临时表有关语句,不记 binlog 里。

创建临时表语句会传到备库执行,同步线程(备库)创建临时表。主库线程退出自动删除临时表,备库同步线程持续运行主库再写DROP TEMPORARY TABLE 传给备库执行。

4.1有趣的问题:

记录 binlog时,不论create table还是 alter table原样记录,空格都不变。 

drop table t_normal, binlog 就会写成:

DROP TABLE  `t_normal` /* generated by server */ 统一标准格式。为什么?

drop table 命令可一次删除多个表。上面例子binlog_format=row主库 "drop table t_normal, temp_t" binlog 记录:

DROP TABLE  `t_normal` /* generated by server */被服务端改写过的命令。

备库上没有表 temp_t,重写后再传到备库执行,不会导致备库同步线程停止

4.2另外一个问题

主库不同线程创建同名临时表没关系,传到备库执行是怎么处理的呢?

S 是 M 备库。

图 5 主备关系中的临时表操作  

table_def_key 不同,当做不同临时表处理。(主库线程 id 写到 binlog)

1.  A 临时表 t1,备库table_def_key 就是:库名 +t1+“M 的 serverid”+“session A thread_id”;

2.  B 临时表 t1,备库table_def_key 就是 :库名 +t1+“M 的 serverid”+“session B 的 thread_id”。

小结

临时表用法和特性。

处理比较复杂的计算逻辑。自己可见的,所以不需考虑重名问题。在自动删除

binlog_format='row’临时表不记录到 binlog 

思考题

临时表改名:alter table 可以,不能用 rename 语法。什么原因?

图 6 关于临时表改名的思考题

rename table按照“库名 / 表名.frm”去磁盘找,临时表frm 文件在 tmpdir 目录下,修改table_def_key,且文件名规则是“#sql{进程 id}_{线程 id}_ 序列号.frm”,报错。

评论1

用连接池中连接来操作,而连接不会释放,保持长连接。用临时表会有问题吗?

会,“自动回收”用于“应用程序异常断开、MySQL异常重启”后,不需主动删除表。

评论2

1.  session 结束DROP TEMPORARY TABLE,掉电,临时表什么时候被清除

2. binlog 中记录了临时表的操作,session 不同,从库中访问不到,这样做的意义是什么

作者回复: 1. 好问题,重启后MySQL会扫描临时目录,把表都删掉

2. binlog是statement的时候,需同步备库,否则备库上执行insert into t_normal (select * from t_temp) 报错

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容