商品系统设计(二):定时更新商品总点击量
2017-01-04 14:50
281 查看
紧接着上节课
1、其实我们只要把日期(不含时分秒)的部分保存在数据库中2、如果同一日期有相同用户点击商品,那么我们对其数值+1
3、否则的话,这张日志表会过于庞大
我们需要修改
prod_clicklog表
CREATE TABLE `prod_clicklog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `prod_id` int(11) DEFAULT NULL, `user_ip` varchar(15) DEFAULT NULL, `user_id` int(11) DEFAULT '0', `clickdate` date DEFAULT NULL, `clicknum` int(11) DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
然后修改存储过程
sp_load_prod:
BEGIN SET @num=0; SET @c=0; SELECT * FROM prod_main where prod_id=_prod_id LIMIT 1; SET @num=FOUND_ROWS(); IF @num=1 THEN #商品取出成功 SELECT count(*) INTO @c FROM prod_clicklog WHERE prod_id=_prod_id AND user_ip=_user_ip AND user_id=_user_id 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=_user_id 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,'192.168.88.88',12); CALL sp_load_prod(1,'192.168.88.88',12);
然后
prod_clicklog表中字段
clicknum就是2
意思是同一天同一个商品的点击量都累加到字段
clicknum,避免每次点击都插入一条新纪录,造成数据库的庞大。
如何定时更新商品主表中的字段
商品主表的总点击量,什么时候更新呢?1、通过web语言来完成,比如写个程序定时执行
2、通过mysql的事件来完成(本课程通过这个方式 )
写个游标
DECLARE cur CURSOR FOR xxx(sql语句) DECLARE CONTINUE HANDLER FOR NOT FOUNT SET isend=1; //游标结束时令issend=1 open cur; //打开游标 fetch cur into xx,xx,xx //预先定义好的变量 while isend !=1 do end while close cur; //关闭游标
新建一个存储过程:
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;#游标结束 OPEN cur;#打开游标 FETCH cur INTO pid,cnum;#取出第一行并把数据放入预先定义的变量 WHILE isend !=1 DO END WHILE; CLOSE cur;#关闭游标 END;
这个游标到所要的结果,类似下面
商品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;#游标结束 OPEN cur;#打开游标 FETCH cur INTO pid,cnum;#取出第一行并把数据放入预先定义的变量 WHILE isend !=1 DO UPDATE prod_main SET prod_click_all=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有值了。
说明这个存储过程实现了我们需要的功能。
下面就要考虑如何利用msyql来定时执行这个存储过程了?
1.首先查看我们的mysql的事件机制是否被打开
默认应该是关闭的(OFF)
SHOW VARIABLES LIKE '%event_scheduler%';
2.如果关闭,需要打开
SET GLOBAL event_scheduler=ON;
3.然后就可以新建mysql事件了(我们这里为了方便使用msyql客户端)
最后我们来新建一个事件
每隔10秒统计一下并更新。注意:实际情况下,我们可以设定在每天晚上几点几分把当天获取到的总数累加到商品表的总点击量。
相关文章推荐
- ButterKnife 在AndroidStudio中的配置
- JMS-ActiveMQ学习笔记
- Linux 文件与目录系统
- keepalived+nginx配置文件及检查nginx服务的脚本
- Linux进程管理及while循环
- mysql 中 select中 用case
- 时间序列/信号处理开源数据集-转
- Linux进程管理及while循环(转)
- 每天一个linux命令(4):mkdir命令
- 一个iOS开发者必须掌握的66个知识点,你掌握了多少?
- 你的气质里面,包含着你走过的路,读过的书和爱过的人
- iOS 国际化手机内切换,不需要重新启动。
- 基于jQuery实现火焰灯效果导航菜单
- ftp Java实现
- 本地yum仓库搭建
- hive 调优总结
- PAT 乙级 1013
- ORACLE 常用查询
- 矩阵连乘
- Tracing a Program As It Runs