MySQL 用户临时表

本文详细介绍了MySQL中的临时表与内存表的区别,强调了临时表的特性,如只对创建它的session可见,自动删除,以及在主备复制中的处理方式。讨论了跨库查询的优化策略,包括汇总表方案,并分析了临时表在磁盘存储和内存区分上的实现细节。
摘要由CSDN通过智能技术生成

临时表 VS 内存表

  1. 内存表,指的是使用Memory引擎的表,建表语法:CREATE TABLE … ENGINE=Memory。所有数据都保存在内存中,系统重启时被清空,但表结构还在
  2. 临时表,可以使用各种引擎
    1. 如果使用的是InnoDB或者MyISAM引擎,数据需要写到磁盘上
    2. 当然也可以使用Memory引擎

特征

session A session B
CREATE TEMPORARY TABLE t(c int) ENGINE=MyISAM;(创建临时表)
SHOW CREATE TABLE t;(Table ‘test.t’ doesn’t exist)
CREATE TABLE t(id INT PRIMARY KEY) ENGINE=InnoDB;(创建普通表)
SHOW CREATE TABLE t;(显示临时表)
SHOW TABLES;(显示普通表)
SELECT * FROM t;(返回1)
SELECT * FROM t;(Empty set)
  1. 建表语法:CREATE TEMPORARY TABLE
  2. 临时表只能被创建它的session访问,对其它线程是不可见的
  3. 临时表可以与普通表同名
  4. 同一个session内有同名的临时表和普通表时,SHOW CREATE语句以及增删改查语句访问的是临时表
  5. SHOW TABLES命令不显示临时表
  6. 在session结束时,会自动删除临时表,临时表特别适用于Join优化的场景
    1. 不同session的临时表可以重名,可以支持多个session并发执行Join优化
    2. 无需担心数据的删除问题,临时表是自动回收的

跨库查询

将一个大表ht,按照字段f,拆分成1024个表,然后分布到32个数据库实例,每个实例32张表
在这里插入图片描述

  1. 选择分区Key的依据:减少跨库查询和跨表查询,如果大部分语句都会包含f的等值条件,就要用f做分区键
  2. 在Proxy这一层解析完SQL语句后,就能确定将这条语句路由到哪一个分区表做查询
    1. 例如SELECT v FROM ht WHERE f=N;,通过分表规则来确认需要的数据被放到哪一个分表上
  3. 假如表上还有另外一个索引k,
    1. 对于SELECT v FROM ht WHERE k >= M ORDER BY t_modified DESC LIMIT 100;
    2. 没有用到字段f,只能到所有分区中去查找所有满足条件的行,然后再统一做ORDER BY操作
  4. 两种实现思路
    1. 在Proxy层的进程代码中实现排序:
      1. 优点:处理速度快
      2. 缺点:开发工作量大,对Proxy端压力较大(内存不足和CPU瓶颈)
    2. 从各个分库拿到数据,汇总到一个MySQL实例中的一个表,然后在汇总表上做逻辑操作

汇总表方案

在这里插入图片描述

  1. 在汇总库上创建一个临时表temp_ht,表里包含三个字段v、k和t_modified
  2. 在各个分库上执行
  3. SELECT v,k,t_modified FROM ht_x WHERE k >= M ORDER BY t_modified DESC LIMIT 100;
  4. 把分库的执行结果插入到临时表temp_ht
  5. 在temp_ht上执行。SELECT v FROM temp_ht ORDER BY t_modified DESC LIMIT 100;

重名

CREATE TEMPORARY TABLE temp_t(id INT PRIMARY KEY) ENGINE=InnoDB;

mysql> SELECT @@tmpdir;
+----</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值