mysql大表中统计数据实用小技巧

一个表中如果数据太多,记录多,例如超过千万条以上,往往有的统计sql中出现group, 各位想想,千万级别的数据量

哪能经得起你这个sql的查询,速度当然慢。 例如下面 :

SELECT date(`time`)d, count(1), p1 FROM logs_mobile_stat_201603
group by d,p1
order by d desc

我们往往在统计的语句中只需要关系一段时间范围的数据,并不是全表的数据,所以我们可以把范围缩小,避免全表扫描。

例如改成:

SELECT date(`time`)d, count(1), p1 FROM logs_mobile_stat_201603
where id>=(select max(id)-5000000 from  logs_mobile_stat_201603)
group by d,p1
order by d desc

上面的5000000是一个范围,数字可以适当修改,例如我我执行关注100万范围的数据,那你就改成1000000

显然速度上要提高得多,我们用explain看下:

sql01

上面type=range,显然只扫描了部分数据,后面扫描的范围的行数也可以看到

这种技巧我个人经常用到,类似:

1,统计3月份push_user表每天增长量

SELECT date(created),count(1) FROM push_user
where id>=(select max(id)-2000000 from  push_user)
and date_format(created,'%Y%m')='201603'
group by date(created)
limit 50

2,统计最近每天签到量

SELECT date(create_time),count(1) FROM `wechat_user_sign_detail` 
where id>=(select max(id)-1000000 from  wechat_user_sign_detail)
and date_format(create_time,'%Y%m')='201603'
group by date(create_time)
limit 50

3,统计最近每天设备增长量

SELECT date(first_visit_time) date,count(1) FROM  mobile_devices
where id>=(select max(id)-1000000 from  mobile_devices)
group by date
order by date desc

各位,上面的只是我在sql统计中的一个小技巧,我觉得很实用,以后我会继续分享更多实用的。

发表评论

邮箱地址不会被公开。