一个表中如果数据太多,记录多,例如超过千万条以上,往往有的统计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看下:
上面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统计中的一个小技巧,我觉得很实用,以后我会继续分享更多实用的。