emmm其实网上优秀的文章有很多,并且mysql也有官方文档,写这个是相当于记录自己的经历吧。
上面说升级的那里,是要执行一个定时任务,每三天执行一次。然后情况如下:
一个商品表,商品有一个id的属性,然后每个商品有关键词信息,对应一个商品-关键词中间表(通过商品id、关键词id为一个主键),关键词其他信息又存放在另一个表里面,这时候要统计商品表的关键词数量,因为实时统计耗费的时间太多了,只能通过定期更新的方式,并作为商品的一个属性。
商品表的每个商品都要进行更新的话,就用到游标来处理,大概思路是这样,首先从商品表获取每个商品的id形成一个集合,然后用游标和while循环遍历每个id,把id拿去中间表里面找到所有关键词id,再把这些关键词id去关键词表查找得出关键词的总数(一个商品对应多个关键词,需要把这些关键词的数量统计出来)
其实重点在于游标的应用和存储过程的应用(语法挺重要的),贴上代码:
- DELIMITER $
- CREATE
- /*[DEFINER = { user | CURRENT_USER }]*/
- PROCEDURE `test`.`yinliucount_new`()
- /*LANGUAGE SQL
- | [NOT] DETERMINISTIC
- | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
- | SQL SECURITY { DEFINER | INVOKER }
- | COMMENT 'string'*/
- BEGIN
- DECLARE goodsid VARCHAR(255);
- DECLARE keywordgoodsid VARCHAR(255);
- DECLARE yinliuc INT;
- DECLARE done INT DEFAULT 0;
- DECLARE cur CURSOR FOR SELECT goodsurlid FROM store_goods;
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
- OPEN cur;
- FETCH cur INTO goodsid;
- WHILE done != 1 DO
- SET keywordgoodsid = SUBSTRING_INDEX(goodsid,"_",-1);
- SELECT COUNT(*) INTO yinliuc FROM (SELECT * FROM store_allkeyword WHERE keywordid IN(SELECT keywordid FROM store_goods_keyword WHERE goodsurlid = keywordgoodsid) GROUP BY keyword_name)d;
- IF yinliuc IS NOT NULL THEN
- UPDATE store_goods SET yinliu_count = yinliuc WHERE goodsurlid = goodsid;
- END IF;
- FETCH cur INTO goodsid;
- END WHILE;
- CLOSE cur;
- END$
- DELIMITER ;
然后用 新建一个定时任务,注释都是一些例子
- DELIMITER $
- -- SET GLOBAL event_scheduler = ON$ -- required for event to execute but not create
- CREATE/*[DEFINER = { user | CURRENT_USER }]*/EVENT `weanalysis`.`d`
- ON SCHEDULE EVERY 2 DAY STARTS '2026-03-16T13:01:27+00:00'
- ON COMPLETION PRESERVE
- ENABLE
- /* uncomment the example below you want to use */
- -- scheduleexample 1: run once
- -- AT 'YYYY-MM-DD HH:MM.SS'/CURRENT_TIMESTAMP { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] }
- -- scheduleexample 2: run at intervals forever after creation
- -- EVERY 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...]
- -- scheduleexample 3: specified start time, end time and interval for execution
- /*EVERY 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...]
- STARTS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1[HOUR|MONTH|WEEK|DAY|MINUTE|...] }
- ENDS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] } */
- /*[ON COMPLETION [NOT] PRESERVE]
- [ENABLE | DISABLE]
- [COMMENT 'comment']*/
- DO
- BEGIN
- CALL test.`yinliucount_new`;
- END$
- DELIMITER ;
然后就设置好了,其他具体的语法,是要去看mysql官方文档还有别人的博客的,我就不班门弄斧了,这个只是一个参考的小例子。
