我现在在做一个统计程序,数据库是这样设计的
CREATE TABLE IF NOT EXISTS `".$tname."` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`l` varchar(1000) default '',//来路页面
`s` varchar(1000) default '',//受访页面
`ym` varchar(150) default '',//受访域名
`uip` INT( 11 ) NULL DEFAULT '0',//用户ip地址
`uid` INT( 11 ) NULL DEFAULT '0',//用户编号
`bid` varchar( 100 ) NULL DEFAULT '0',//浏览器
`utime` INT( 11 ) NULL DEFAULT '0'//访问时间
) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ;
现在每天的统计的数据量在800万-1000万条
我需要查询每天受访域名、受访页面、浏览器等这些信息(类似cnzz网站统计的效果,在查询中用到了group)。在查询的时候相当慢,打开页面等很久也显示不出来数据。请问各位有没有什么好的方法的?不管是数据库设计方面还是sql语句方面都可以给我说说,谢谢了。小弟不胜感激!
我
CREATE TABLE IF NOT EXISTS `".$tname."` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`l` varchar(1000) default '',//来路页面
`s` varchar(1000) default '',//受访页面
`ym` varchar(150) default '',//受访域名
`uip` INT( 11 ) NULL DEFAULT '0',//用户ip地址
`uid` INT( 11 ) NULL DEFAULT '0',//用户编号
`bid` varchar( 100 ) NULL DEFAULT '0',//浏览器
`utime` INT( 11 ) NULL DEFAULT '0'//访问时间
) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ;
现在每天的统计的数据量在800万-1000万条
我需要查询每天受访域名、受访页面、浏览器等这些信息(类似cnzz网站统计的效果,在查询中用到了group)。在查询的时候相当慢,打开页面等很久也显示不出来数据。请问各位有没有什么好的方法的?不管是数据库设计方面还是sql语句方面都可以给我说说,谢谢了。小弟不胜感激!
我
另外show index from `".$tname."` 看看索引情况。
$sql="select count(s) as c from stat_20101105 group by s";show index from stat_20101105结果如下:
table->stat_20101105
non_union->0
key_name->primary
seq_in_index->1
colunm_name->id
callation->a
cardinality->7146648
sub_part->
packed->
null->
index_type->btree
comment->
CREATE INDEX part_of_s ON stat_20101105(s(10));
select s,count(s) as c from c group by s order by c desc limit 50
第一次执行时间为1分钟左右,刷新执行,时间为0.00
打印出
explain select s,count(s) as c from c group by s order by c desc limit 50;
看看。
假设您的缓存表是s_c`s` varchar(1000) default '',//受访页面
`c` INT( 11 ) NULL DEFAULT '0',//页面数量然后定期执行
create table s_c_tmp select s,count(s) as c from c group by s order by c desc;
drop table if exists s_c_20101110;
rename s_c_tmp to s_c_20101110;
mysql的查询性能是依赖于索引的,因此需要给s字段建索引。
按照你的数量级,建议每天生成一张新表
速度还不行的话,对`s` varchar(1000) default '',//受访页面进行hash,数据库中保存一个hash int值,这样速度会更快
2.不要用数据库存储这些信息,改用文本存储,或者直接分析日志后,将汇总数据存入到数据库
3.改用分布式存储,比如hadoop或者monodb