一切从简的理念 —— 用照片与文字记录我的生活,工作和想法

工作的SQL查询优化

今天刚完成一个功能的性能优化,就是我们平台的管理后台,有个统计数据页面,里面有一个子图是查询访问记录的,就是那些经典的PV,UV数据,还有活跃UV和新增UV的数据要统计。

这个统计还要按时间范围来查询,近一个月的数据、近7天的数据和今天的小时级别的数据,动态地刷新统计图表。

所以逻辑比较复杂。虽然都只是查一个表,但这个表的数据量很大,有几十万的记录,而且每天按小时计算,就有24 X 4 = 96次的查询,导致查询时间很长。如果不使用优化,直接查询,会有1分多钟的查询时间,这么慢是人不能接受的。

经过和同事讨论,发现可以用冗余表计数来优化查询,即把重复的查询结果,写入一个临时表里,近7天的数据就很快查出来了,而当天的数据要实时查询理论会很慢,但因为量少所以会比较快。所以按天查询的问题就解决了。

但事情并不是这么简单。因为有当天数据要按小时查询,而且要求实时查询,所以查询时间会很长,于是我用redis缓存之前的小时数据,最近的一小时的数据就实时查询,于是又解决了按小时查询的慢。

还有一个难点值得提出的,是新用户uv这个数据,要查出当天按小时的新用户数量,难在哪里呢?新用户指的是比起从0到某时间里的用户,在某时间到现在出现了,但没在之前出现过的,定义为新用户,这就很复杂了,因为每次查询都要从0到现在搜索一遍,查询变得很慢。于是我又用了缓存,把每次之前的数据都缓存下来,这样查询效率刚好高了一倍。

综上,可以实现这么复杂的查询,1秒内出结果。把1分钟的查询优化到1秒了。

这是个突破,也是我从事php这两年来优化得最好的一个查询了。

这是最终演示视频如下,可以看出,通过时间范围筛选,页面响应基本是即时的。




已有 2 条评论
  1. 学习笔记Blog

    有一阵子没来了!过来看看先!

    学习笔记Blog   Windows 7 / Google Chrome 回复
    1. 星球彦

      欢迎欢迎~

      星球彦   Windows 10 / Firefox 回复
发表新评论