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听说统计方面还不错,后面有机会要去试试。