临时表的运用

背景:

上次接到了一个需求,做公司商品的售罄率,需求做完之后产品还想看去年任意时间段的售罄率(售罄率≈销售数量/库存数量),但是我发现一个问题,第三方的系统中只有最新的库存快照,没有每天的系统快照,于是只能从店铺的开店的第一天根据公式来估算每天的库存快照(当日库存=调拨入+退货-调拨出-销售),通过计算然后多线程插入算出了一年的库存快照,通过关联七八个表查出结果集从而展示,由于每个表都是千万级别的数据,然后sql的子查询也特别多,所以导致查询的时间非常漫长,经查阅,采用了临时表的方案,将所有的子查询查出来存入相应的临时表,然后临时表之间在进行关联,速度大概优化了一百倍左右。

简介:

临时表是建立在系统临时文件夹中的表。临时表的数据和表结构都存储在内存之中,退出的时候所占的空间会被释放

创建临时表

关键字为temporary

create temporary table dome_table(
name varchar(10) not null,
pid int not null
);

查看建表的sql

show create table dome_table;

也可以直接建表将查询的结果集导入表中

create temporary table dome_table1
select name,pid from dome_table;

 

删除临时表

DROP TABLE dome_table;

临时表的应用场景

当工作在十分大的表上运行时,运行相关查询,来获的一个大量数据的小的子集。较好的办法,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表,然后对这些表运行查询

  • 一个sql语句关联两个表以上的时候,查询到的结果存放在临时表中。
  • 程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等
  • 临时表默认的是MyISAM,但是可以修改
  • 内部临时表,就是查询的时候,服务器会优化查询,使用内部临时表。比如 order by 的列不是from中的第一列。

临时表的注意事项

  • 临时表只在当前连接可见,当这个连接关闭的时候,会自动drop。比如打开mysql 就是一个连接会话。两个不同的连接可以使用相同名字的临时表,两个表之间不存在什么关系,如果临时表的名字和已经存在的磁盘表名字一样,那么临时表会暂时覆盖磁盘表。就是说,你select 查询,只会显示临时表里面的,不会显示磁盘表。
  • 临时表的存储引擎:memor,myisam,merge,innodb
  • 临时表不支持,mysql cluster
  • 同一个查询语句,只能用一次临时表,就是说不能将表和自己做连接等。
  • 重命名表,不能用rename 可以用alter table代替
  • 如果超出了临时表的容量,临时表会转换成磁盘表

最后放一张xml的图

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值