DELIMITER $$USE `test_liu`$$DROP PROCEDURE IF EXISTS `stat_comes_page`$$CREATE DEFINER=`root`@`61.190.33.%` PROCEDURE `stat_comes_page`()
BEGIN
  /* 
  来路页面,最小统计时间单位为天,统计每天各来路地址访问情况:来访次数(pv)、
  独立访客(uv)、IP,新独立访客、新访客浏览次数,站内总浏览次数;
  */
DECLARE done INT DEFAULT 0;

-- declare rightdate date default date_add(curdate(), interval -1 day);
DECLARE loginDate DATETIME;
DECLARE VisitorUrl VARCHAR(200);
DECLARE WebId VARCHAR(20);
DECLARE iPV INT;
DECLARE iUV INT;
DECLARE iIP INT;
DECLARE iall INT;
DECLARE iCount INT;
DECLARE iNew INT;
DECLARE iNewAllPV INT;
DECLARE iBounceRate FLOAT;
DECLARE iTimeLength FLOAT;
DECLARE v_id VARCHAR(20);

DECLARE mycursor CURSOR FOR (SELECT visitor_url,web_id,COUNT(log_id),login_date FROM main_logs_ex WHERE deal_flag='0' GROUP BY login_date,web_id,visitor_url);
-- 游标到最后
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 



-- 创建临时表
DROP TABLE IF EXISTS temp_table1;
CREATE  TEMPORARY  TABLE `temp_table1` (`value` VARCHAR(50) DEFAULT NULL);
CREATE INDEX temp_table1_value ON temp_table1(VALUE(20));
DROP TABLE IF EXISTS temp_table2;
CREATE TEMPORARY  TABLE `temp_table2` (`value` VARCHAR(50) DEFAULT NULL) ;
CREATE INDEX temp_table2_value ON temp_table2(VALUE(20));

-- 打开游标
OPEN mycursor;
-- 开始获取数据
FETCH mycursor INTO VisitorUrl,WebId,iCount,loginDate;  -- 来访次数
WHILE done <> 1 DO

 TRUNCATE TABLE temp_table1;
 TRUNCATE TABLE temp_table2;

 INSERT INTO temp_table1 SELECT DISTINCT session_id FROM main_logs_ex WHERE web_id=WebId  AND  login_date=loginDate AND visitor_url=VisitorUrl ;
 INSERT INTO temp_table2 SELECT DISTINCT vistor_ip  FROM main_logs_ex WHERE web_id=WebId AND login_date<loginDate AND login_date>DATE_ADD(CURDATE(), INTERVAL -90 DAY) ;
  SELECT COUNT(log_id) INTO iPV FROM main_logs_ex a,temp_table1 b FORCE INDEX (temp_table1_value) WHERE  web_id=WebId AND a.session_id=b.value AND login_date=loginDate ;
 SELECT COUNT(DISTINCT vistor_ip) INTO iNew FROM main_logs_ex WHERE  web_id=WebId AND login_date=loginDate AND visitor_url=VisitorUrl  AND NOT EXISTS (SELECT VALUE FROM temp_table2 FORCE INDEX (temp_table2_value) WHERE VALUE=main_logs_ex.`vistor_ip`) ;

 IF iPV>0 THEN
INSERT INTO stats_come(web_id,factors_id,factors_value,pv,uv,ip,avr_access_time,bounce_rate,new_up,new_pv_count,all_pv_count,stat_date)
VALUES(WebId,'7',VisitorUrl,iCount,iUV,iIP,iTimeLength,iBounceRate,iNew,iNewAllPV,iPV,loginDate);
 END IF;
    -- 继续获取数据
    FETCH mycursor INTO VisitorUrl,WebId,iCount,loginDate;
END WHILE;
CLOSE mycursor;
 
END$$DELIMITER ;请问一下。。我这个存储过程为什么要执行3分多钟呢望各位帅哥把我看看啊怎么优化呢

解决方案 »

  1.   

    SELECT visitor_url,web_id,COUNT(log_id),login_date FROM main_logs_ex WHERE deal_flag='0' GROUP BY login_date,web_id,visitor_url---这句话可以建个临时表
      

  2.   

    被骗了,我是来看美女的......
    1.你先上图片
    2.你把表结构贴出来即可,你这个存储过程太乱了,估计不需要你这样写的
    #****************************************#
    MySQL技术及运维自动化网:www.mysqlops.com新浪微博账号:http://weibo.com/mysqlops
    #****************************************#