Contents
  1. 1. 降维
  2. 2. 比较
  3. 3. 写入

原表中有许多维度的细粒度记录,如domain,status,time三者共同作为Key,但是有需要查询所有domain的某时间状态数据,此时由于记录太多,查询速度非常慢,所以有需要将表进行降维,即消除domain维度,将Key变为status+time的二维。

降维

降维的操作可以用到group bysum.

1
select status, time ... sum (xxx) as xxx from table where (...) group by time, status;

group by会以time+status为id对所有记录进行分类,使用聚合函数sum则可以将同类数据相加,还可按需使用max,min等函数从而达到降维目的。

比较

查询到数据之后,需要将其更新到新表中,但只需要更新新增项和数据有修改的项。此时需要用到left join
left join顾名思义以左为准,即只要在左表出现,右表即使为空也会出现在结果中,因此特别查找适合“新增”项。

1
select * from (上文查询语句) t left join newtable n on ( t.time = n.time and t.status = n.status) where (n.xxx is null or n.xxx <> t.xxx);

写入

最后就是如何将查询结果插入到新表中,直接insert into查询结果即可,但是需要注意一项,即已存在的表项不要重复插入,而是更新即可,此时需要使用 on duplicate key update
完整的语句应该是

1
insert into newtable <上一语句> on duplicate key update newtable.xxx = t.xxx;

Contents
  1. 1. 降维
  2. 2. 比较
  3. 3. 写入