首页 > 数据库技术 > 详细

mysql颠覆实战笔记(五)--商品系统设计(二):定时更新商品总点击量

时间:2016-08-05 06:23:34      阅读:209      评论:0      收藏:0      [点我收藏+]

  继续回到沈老师的MYSQL颠覆实战,首先回顾下上一节课的内容,请大家会看下上节课写的存储过程。

  打开prod_clicklog表, 我们只要把日期(不含时分秒)的部分存在数据库中, 如果同一日期有相同用户点击商品,那么我们对其数值+1,否则的话,这张点击日志表会过于庞大

  下面我们将prod_clicklog表修改下:

  技术分享

  将字段clickdate 修改为 date类型,增加clicknum字段,默认为1.

  然后,我们把上一节课的存储过程sp_load_prod再修改一下:

BEGIN
    SELECT * FROM prod_main WHERE prod_id = _prod_id LIMIT 1;
    SET @num=FOUND_ROWS();
    SET @c=0;
    IF @num=1 THEN #代表商品取出成功
    SELECT count(*) INTO @c FROM prod_clicklog WHERE prod_id = _prod_id AND user_ip=_user_ip AND user_id=_userid AND clickdate=CURRENT_DATE;
        if @c>0 THEN #代表已经点击过,只要对clicknum累加1
            UPDATE prod_clicklog SET clicknum=clicknum+1 WHERE prod_id=_prod_id AND user_ip=_user_ip AND user_id=_userid AND clickdate=CURRENT_DATE;
            ELSE    #新增点击日志
            INSERT INTO prod_clicklog(prod_id,user_ip,user_id,clickdate) VALUES (_prod_id,_user_ip,_user_id,CURRENT_DATE);
        END IF;

    END IF;
END

  接着我们还是新建查询,call一下 sp_load_prod(1);

  技术分享

  prod_clicklog表中的数据:

  技术分享

  然后我们多次执行上面的存储过程:

  技术分享

  OK,这个思路没有任何问题。

  这时问题来了。那么商品表中的总点击量,什么时候更新呢?  

  1、通过web语言来完成,譬如写个程序定时执行

  2、本课时要讲的是通过mysql的事件来执行.

   我们先执行下面的查询语句: 

SELECT prod_id,sum(clicknum) FROM prod_clicklog GROUP BY prod_id;

 这样就能取出一堆 id,和执行总条数

   技术分享

  于是我们写个存储过程count_prod_click,来实现游标,

BEGIN
    DECLARE isend int DEFAULT 0;
    DECLARE pid int; #代表商品ID
    DECLARE cnum int; #代表点击量总数
    DECLARE cur CURSOR FOR SELECT prod_id,sum(clicknum) from prod_clicklog GROUP BY prod_id;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET isend =1 ; #游标结束时令isend =1
    open cur; #打开游标
    FETCH cur into pid,cnum; #预先定义好的变量,取出第一行,并把内容放入预先定义好的变量
    while isend !=1 DO

            UPDATE prod_main SET prod_click_all = cnum WHERE prod_id =pid; # 更新商品主表的总点击量
            #这里可以写业务代码
        FETCH cur into pid,cnum;
    end while;
    close cur;

END

  老规矩,我们新建查询

CALL count_prod_click;

  然后刷新主表,可以看到,prod_click_all字段已经被更新

  技术分享

  最终使用mysql新建一个事件,令每隔10秒统计一下并更新

  我们先查询下mysql事件是否开启

show VARIABLES like %event%

  技术分享

  如果没有开启:

SET GLOBAL event_scheduler=ON;

  OK,现在我们新建一个事件 event_count_prodclick:

  技术分享

  技术分享

 

   然后我们根据这个延时加载在实战中合理应用。

 

版权声明:笔记整理者亡命小卒热爱自由,崇尚分享。但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的《web级mysql颠覆实战课程 》。如需转载请尊重老师劳动,保留沈逸老师署名以及课程来源地址。

上一课:mysql颠覆实战笔记(四)--商品系统设计(一):商品主表设计

mysql颠覆实战笔记(五)--商品系统设计(二):定时更新商品总点击量

原文:http://www.cnblogs.com/xz1024/p/5738999.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!