21 06 2019

背景:

上次接到了一个需求,做公司商品的售罄率,需求做完之后产品还想看去年任意时间段的售罄率(售罄率≈销售数量/库存数量),但是我发现一个问题,第三方的系统中只有最新的库存快照,没有每天的系统快照,于是只能从店铺的开店的第一天根据公式来估算每天的库存快照(当日库存=调拨入+退货-调拨出-销售),通过计算然后多线程插入算出了一年的库存快照,通过关联七八个表查出结果集从而展示,由于每个表都是千万级别的数据,然后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;


临时表的应用场景

  1. 当工作在十分大的表上运行时,运行相关查询,来获的一个大量数据的小的子集。较好的办法,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表,然后对这些表运行查询
  2. 一个sql语句关联两个表以上的时候,查询到的结果存放在临时表中。
  3. 程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等
  4. 临时表默认的是MyISAM,但是可以修改
  5. 内部临时表,就是查询的时候,服务器会优化查询,使用内部临时表。比如 order by 的列不是from中的第一列。

临时表的注意事项

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


最后放一张xml的图 

 

延伸阅读
  1. Spring+Websocket相遇、相知、相爱、相杀(附源码和在线演示)
  2. 使用echarts折线图遇到的问题
发表评论