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

原创
2016/03/16 20:35
阅读数 2.5K

                                                                         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 评论
4 收藏
1
分享
返回顶部
顶部