MySql 的group by having 优化案例

来源:互联网 发布:比特币交易平台 知乎 编辑:程序博客网 时间:2024/04/25 18:15

Background:
1.pay_award_log为一张审核表,表有重复的记录,数据约51W条
2.award_time字段有btree索引,operator字段没有索引,根据operator和award_time查询频率是一样的
3.operator为后台审核人,uid是用户字段,用户在一天内可能有多条记录,求175587这个后台人员一天内审核的用户数,需要根据uid排除重复的记录

select count(*) no from
(select * from pay_award_log group by uid having award_time between UNIX_TIMESTAMP(‘2017-12-07 0:0:0’) and UNIX_TIMESTAMP(‘2017-12-07 23:59:59’) and operator = 175587 ) as award_count
这样子的查询需要耗时0.6-0.8秒,处女座程序员是绝对接收不了这样的龟速的,况且一个页面还有多条这样的sql要查询,一个页面有9条这样的查询,打开这个统计的页面要7-8秒真的是超级慢!

分析SQL:
1.这里查询慢group by是一个很关键的因素,考虑干掉他,用程序去去重
2.多条这样的sql就是where operator = 175587、operator = xxxxx这样的,直接去掉operator, 保留一个索引的where条件,用程序去过滤条件
3.再把统计为昨天的数据增加上缓存,今天的数据也增加上缓存,当天的数据缓存时间设置短点5-30分钟这样
整个优化方案下来页面访问速度提升到0.3S,比之前的访问速度提升了25倍,有缓存的情况下直接秒读

原创粉丝点击