这个查询需求,表设计要不要冗余

发布于 2022-09-04 09:28:00 字数 271 浏览 25 评论 0

数据来源:每天记录一次电表的历史用电总量。

查询需求:最近1天、2天、10天、15天、30天、...、若干天 的用电量统计。

实现方法:
方法1:在select中嵌套N个子查询:select (xx)1天, (xx)2天, (xx)10天, ... , (xx)100天 from table
方法2:每天在记录历史用电总量的同时,计算出N个时间段内的用电量,冗余写在表里。
是否有其它更好方法?

谢谢伟大的segmentfault网友。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

毁梦 2022-09-11 09:28:00

上面两位的建议都是先做预统计,但有没想过,这预统计是每天都要执行,但你查询的时候可能就某一天,而且也就查询前n天的数据,也就是你最多需要遍历n条的数据,mysql的这点性能还是有的。
你只需要的是每天凌晨统计出前一天的用电量(不是总电量),查询的时候相当于只要把时间以内的总电量依次累加起来就好。
说明下,查询的电量表A中得含有统计的日期cur_date,统计当天的用电量cur_elect。(cur_date加个索引效果更佳)

select sum(if(cur_date>=DATE_ADD(CURDATE(),INTERVAL -1 DAY),cur_elect,0)) as 最近1天,
       sum(if(cur_date>=DATE_ADD(CURDATE(),INTERVAL -2 DAY),cur_elect,0)) as 最近2天,
       ...
       sum(if(cur_date>=DATE_ADD(CURDATE(),INTERVAL -N DAY),cur_elect,0)) as 最近N天,
  from A
  where cur_date>=DATE_ADD(CURDATE(),INTERVAL -N DAY)

N为查询最近天数最大值
更或者直接传到后台去,循环遍历,毕竟统计完前m-n天,前m天可以利用前m-n天的数据

倾其所爱 2022-09-11 09:28:00

每天凌晨执行一遍方法1的sql语句,存进redis中,然后数据查询都去查redis。

瀞厅☆埖开 2022-09-11 09:28:00

mysql有个定时任务 event ,可以尝试了解下

DROP EVENT IF EXISTS e_xxxx;

DELIMITER //
CREATE EVENT IF NOT EXISTS e_xxxx
ON SCHEDULE EVERY 1 DAY STARTS '2016-01-15 23:59:59'
ON COMPLETION PRESERVE
DO
BEGIN
    #--TODO 这里可以写一个存储过程 调用就好了
    CALL p_xxxxxxxxx();
END//

DELIMITER ;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文