Java定时任务中间表,mysql 通过定时任务更新中间表

mysql 通过定时任务更新中间表

以前有一个任务需求,统计前十个物品的数量和名字。当时该表的数据量一共有四百二十多万的数据。执行一个sql语句花了我25秒,sql语句如下:

select DISTINCT (XXX), count(*) AS number from `XXXX` group BY XXX;

很多同学一感到慢就觉得该建索引了,但是事实上,索引对xxx效果并不大,排序走索引确实好,可是,使用排序的时候对对上一个的结果进行排序。而且建立索引的键值最好不好重复太多的,而上述的xxx有很多重复的值,这个时候对xxx建索引也并不是一个好的注意。

EXPLAIN select DISTINCT (xxx), count(*) AS number from `xxxx` group BY xxx; 发现是全表扫描。

思考了半天发现,这种单表统计的某列(无索引)数据的时候基本上没有任何比较好的方法,没有办法的情况下:只有建立一个中间表来解决这个问题。然后通过定时任务去统计数据,保证数据在不断的更新,那个时候数据库的压力并不是很大,也没有用缓存,就想交给数据库做,灵机一动的我还真找到了方法:

//创建一个存储过程

DELIMITER #

CREATE PROCEDURE temp()

BEGIN

insert into test(name) values(1);

COMMIT;

END #

DELIMITER;

//mysql 是默认没有开始 event 事件的

SET GLOBAL event_scheduler = ON;

//创建一个mysql的定时任务,1分钟执行一次,举一个例子哈,其实没有必要那么频繁的,当然是看任务场景哈。

CREATE event IF NOT EXISTS temp_event ON SCHEDULE EVERY 1 MINUTE

ON COMPLETION PRESERVE

DO CALL temp();

#删除事件#

DROP event temp_event;

后面每次就查test这个中间表保存的结果就可以了,也算是勉强完成了任务,至今没有找到更好的办法。

//注意,mysql这类的数据库说实话还是不适合专门用来做统计类型的数据库。PostgreSQL听说统计方面还不错,后面有机会要去试试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值