繼續回到沈老師的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:
然後我們根據這個延時加載在實戰中合理應用。