php - 一个mysql优化的问题
巴扎黑
巴扎黑 2017-04-10 16:19:30
0
4
527
**log表结构如下**
id int(10) primary key #主键
ip varchar(32) #ip
time int(10) #时间
channel varchar(128) #渠道id 普通索引
status int(10) #状态标识

channel字段为几个渠道号channel01,channel02...channel20
status为不同的状态标识 比如1代表打开次数,2代表关闭次数等

需求是:
统计不同渠道 不同状态 每天的总ip数量
统计不同渠道 不同状态 每天的去重ip数量
统计不同渠道 不同状态 每天的新增ip数量(当天ip,且当天之前数据库中不存在的ip)

下面为统计渠道channel01,状态status=1的各项数量

目前的实现方法是:
比如2015-11-11当天的数量
先用php算出2015-11-11的凌晨时间戳$begin和2015-11-12的凌晨时间戳$end

**A-- 当天ip总数 $total**
SELECT COUNT(*) FROM log WHERE time>={$begin} AND time<{$end} AND status=1 AND channel=channel01;
**B-- 当天ip去重数 $group**
SELECT COUNT(*) FROM log WHERE time>={$begin} AND time<{$end} AND status=1 AND channel=channel01 GROUP BY ip;
**C-- 当天的ip   $ip_str (PHP处理)**
SELECT ip FROM log WHERE time>={$begin} AND time<{$end} AND status=1 AND channel=channel01 GROUP BY ip;
**D-- 当天ip在当天之前出现过的数量  $before**
SELECT COUNT(*) FROM log WHERE ip IN ($ip_str) AND time<{$begin} GROUP BY ip;
**E-- 新增的ip数量**
$new = $group - $before

现在表中一共有52万条数据,每天新增大概3万条数据,去重后的也有2万多,在执行第四步(语句D)的时候执行时间为3秒左右

请问有没有什么办法可以优化这个sql语句,或者有没有其它的什么方法实现这个需求?

巴扎黑
巴扎黑

reply all(4)
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!