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

  继续回到沈老师的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颠覆实战笔记(四)--商品系统设计(一):商品主表设计

时间: 2024-08-02 10:58:16

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

mysql颠覆实战笔记(三)-- 用户登录(二):保存用户操作日志的方法

版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸老师署名以及课程来源地址. 现在我们接着上节课,完成第二个功能,不管成功不成功都记录一个日志. 一.回顾上节课内容,我们在user_log表中添加一个字段 user_id.  在上一节课的存储过程新增一行代码,如下: BEGIN set @gid=0; set @user_name=''; set @_res

mysql颠覆实战笔记(六)--商品系统设计(三):商品属性设计之固定属性

今天我们来讲一下商品属性 我们知道,不同类别的商品属性是不同的. 我们先建一个表prod_class_attr: 给这个表填入一些数据: 接下来,我们再建一个商品属性对应表 prod_attr 好了,下面我们把新增商品的流程撸一遍: 第一步,往商品主表插入数据 我们来新建一个存储过程 sp_new_prod: BEGIN INSERT INTO prod_main(prod_name,prod_classid) VALUES (_prod_name,_class_id); END 参数:IN _

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

版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸老师署名以及课程来源地址. 这几节课沈老师先带我们说道一下商品表. 固定商品:譬如我们只是卖鞋,那么整个商品的属性基本都是一致的,列如鞋的颜色.尺寸.款式.品牌.价格.这时候我们涉及到的表往往是平面的. 这种涉及方法的特点: 1.纯定制化. 2.开发快,仅仅只要针对某些元素开发. 3.但是扩展性差,一旦我们新

mysql颠覆实战笔记(二)-- 用户登录(一):唯一索引的妙用

版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸老师署名以及课程来源地址. 一.首先我们用上节课的存储过程对两张表压100万数据(各100万). 第一表 user_sys我们使用的是InnoDB模式,小卒自己的插入结果是: 第二张表 user_sys2我们使用的是MyISAM模式,小卒自己的插入结果是: 两个引擎的效率差异明显,所以我们再使用中根据实际情况

mysql颠覆实战笔记(七)--白话理解事务

今天我们学习web开发级mysql颠覆实战课程第9课没MYSQL事务(一):白话理解事务.前面有两节课第7讲:商品系统设计(四):商品属性设计之自定义属性,第8讲:商品系统设计(五):一维属性的商品价格表设计的笔记本人省略,没有原因,个人爱好. 所谓事务,用老师白话理解就是: 1.不止要执行一个步骤.2.这些步骤每一步都按照既定想法去执行,错一步那么整个过程都反悔.3.事务进行时,外界干扰无法影响. 这算是老师的一个基础讲解,首先我们来建一张用户余额表,这个表我们采用的是Innodb模式,在这个

mysql颠覆实战笔记(八)--mysql的自定义异常处理怎么破

这一节课,沈老师带我们了解事务的异常 什么是异常? 我们先插入一组数据: insert into user_balance(user_id,user_money) values (3,10.5); 这个是正常的.但是我们把插入的user_money的值故意弄错:如下 insert into user_balance(user_id,user_money) values (3,‘abc’); 那么我们会得到一个ERR . 这个错误是如果报出来的呢?老师直接用工具新建一个存储过程来给我们演示: BE

【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价

昨天把项目部署了一下,玩了玩,今天完善了一下购物车中修改商品数量就能局部更新相应的总价的功能,大家都知道这得用Ajax实现,我之前也没学Ajax,刚好借助这个小功能,去简单学习一下Ajax的知识. 1.问题的分析 先看一下页面中的情况:  功能如上,在没有Ajax之前,一般都是根据用户修改的值去找Action,然后返回新的jsp页面重新加载整个页面,完成数字的更新.但是有了Ajax技术后,我们可以利用Ajax技术局部刷新要改变的地方,而不是重新加载整个页面.首先看一下上图对应的jsp部分的代码:

mysql颠覆实战学习记录 :用户充值功能实现(二):钱的安全性之表锁 12

表锁分为read和write read锁: lock table 表名 read; unlock tabls; #解锁 当前会话只能读取数据,不能插入数据. 其他会话能读取数据,不能插入数据,解锁后数据插入. write锁: lock table 表名 write; 当前会话可以读书数据,可以插入数据: 其他会话,不能读取数据,也不能插入数据:

mysql颠覆实战学习记录 :用户充值功能实现(一):当服务器卡顿7秒发生了什么 11

1.首先创建两个表,充值日志表(user_balance_log).用户余额表(user_balance) 表结构如下: (1)user_balance: (2)user_balance_log: 注:log_type 日志类型1代表充值 2代表消费 3代表转账 2.写存储过程模拟用户充值 BEGIN #Routine body goes here... declare t_error int default 0; declare usercount int default 0 ; declar