我觉得 楼主是自己写的循环,要执行很多次查询,代价是很大的。
 
下面的代码是一系列sql查询,连续执行即可,不需要建立procedure。 
我觉得在效率上应当比较快,我想整个执行过程不会超过一分钟。   
如果没有错误,希望楼主把执行时间告诉我。谢谢 
-- 选择数据库
use mztest;
-- 以下是创建楼主需要的表,用于测试
create table user
(
 ID int(10) PRIMARY KEY auto_increment   ,
 userid varchar(30)
);
create table archives
(
ID  int(11)   unsigned   PRIMARY KEY auto_increment ,
click  int(11)   unsigned ,
title   varchar(80) ,
pubdate int(11),
adminID int(11) ,
maxpage int(4)
);
create table access
 (
 id int(4) PRIMARY KEY auto_increment  ,
aid int(4),
ipaddress varchar(15),
time bigint(4)
);
-- 创建文章aid与总的点击次数click的映射表
create table archive_click
(
aid int(11) PRIMARY KEY,
click int(11)
);
insert into archive_click(aid,click)
select aid, count(*)
from access
group by aid
order by aid;
-- 创建具有少量必要信息的临时表
-- 得到tmp1_table大小约为1,000,000
-- 执行过程中因为archive_click表中aid为主码,所以速度不会很慢
create table tmp1_table
select A.aid, FROM_UNIXTIME(time,"%Y-%m-%d") date, ipaddress
from access as A, archive_click as B
where A.aid = B.aid and B.click >= 100;
-- 分组统计,得到单日的click和union_ip
-- 得到tmp2_table大小约为3831*52 = 200,000
-- 执行主要是对tmp1_table表中元组一个排序过程,时间复杂度为O(nlogn)=20,000,000 
create table tmp2_table
select aid, date, count(*) click, count(distinct(ipaddress)) union_ip
from tmp1_table
group by aid,date;
-- 将所有信息融合到一个表中
-- 由于都是主码上的连接,所以速度也不会很慢
create table editor_record
select U.ID uid, U.userid username, T.aid aid, A.title title, A.pubdate pubdate, A.maxpage maxpage, T.click click, T.union_ip union_ip, T.date time
from tmp2_table T, archives A, user U
where T.aid = A.id and A.adminID = U.ID;
-- 删除临时表
drop table tmp1_table;
drop table tmp2_table;
drop table archive_click;

解决方案 »

  1.   

    1、int(4) ->  SMALLINT(4)BIGINT(4) 这我就不理解了 int(10) 的吧2、看到经常出现 count(distinct(FROM_UNIXTIME(time,'%Y-%m-%d'))) ,不如建立一个DATE类型的冗余字段 =======================================计算一篇文章独立ip的方法为: select access.aid,access.time,count(distinct(FROM_UNIXTIME(time,'%Y-%m-%d'))) as cnt 
    from `access` 
    where aid =文章id
    group by c.aid
    独立ip的算法是:如果一个ip地址在同一条内出现两次,只记一次,否则记它出现的次数。1、这句SQL的group by 没有看明白,可否解释一下
    2、下面独立IP的算法在什么地方实现的?对数据库有操作还是对返回结果集进行处理?
    3、请解释一下程序的目,是否就是要统计
    【所有用户(大概20个) 
    所发的所有点击量> =100的文章(共3831篇) 
    每篇文章每一天所带来的独立ip数量】4、如果是长期的任务,我觉得用流量统计代码来统计比较合适。一次性的工作实在价值不大。这条非技术观点。
      

  2.   

    学习了!
    4楼的代码思路清晰,不妨试一下!
    另外,手册说条件声明要放在游标前面!DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;
    DECLARE cur_1 CURSOR FOR Select aid from tmp_table;
      

  3.   

    下面的代码是一系列sql查询,连续执行即可,不需要建立procedure。   
    我觉得在效率上应当比较快,我想整个执行过程不会超过一分钟。
    建立存储过程当然比直接执行SQL语句要快。因为存储过程是编译在数据库系统里面的。