我觉得 楼主是自己写的循环,要执行很多次查询,代价是很大的。
下面的代码是一系列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;
下面的代码是一系列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;
解决方案 »
- dreamweaver cs4的一个fck编辑器插件的应用错误
- 一个奇怪现象,php不能执行代码
- 如果保存textarea里的图片
- php的system函数的意思
- php中传值问题和页面重定向问题
- 今天看了一些论坛的代码,发现它们并没有用session_start().他们是这样实现session的呢。请高人分析先,如IPB论坛。
- 发现一个问题,
- 在第一页定义了cookie变量并赋了值,为什么在另一个页面该变量就为空了!!
- 我用<a href='aa.doc'>打开word文档时,英文就行,而中文的word文档就不行,如何解决?
- 求教一个MYSQL数字和字母混合排序问题
- delphi跟php的Unix的时间算法竞然不相同
- socket发送mail的问题
from `access`
where aid =文章id
group by c.aid
独立ip的算法是:如果一个ip地址在同一条内出现两次,只记一次,否则记它出现的次数。1、这句SQL的group by 没有看明白,可否解释一下
2、下面独立IP的算法在什么地方实现的?对数据库有操作还是对返回结果集进行处理?
3、请解释一下程序的目,是否就是要统计
【所有用户(大概20个)
所发的所有点击量> =100的文章(共3831篇)
每篇文章每一天所带来的独立ip数量】4、如果是长期的任务,我觉得用流量统计代码来统计比较合适。一次性的工作实在价值不大。这条非技术观点。
4楼的代码思路清晰,不妨试一下!
另外,手册说条件声明要放在游标前面!DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;
DECLARE cur_1 CURSOR FOR Select aid from tmp_table;
我觉得在效率上应当比较快,我想整个执行过程不会超过一分钟。
建立存储过程当然比直接执行SQL语句要快。因为存储过程是编译在数据库系统里面的。