Django 数据库查询优化

一个非常简单的表
ID主键 和 Time 时间字段

数据量大概每天2W,现在要生成一个图表。

clipboard.png

目前查询方式是这种。

        now = timezone.now().date() - timezone.timedelta(days=2)
        current_day_data = SerachAssetData.objects.filter(time__gte=now)

        data = [0 for a in range(24)]

        for a in current_day_data:
            data[(a.time.hour)] += 1

        data = data[:6] + data[6:]

用这个查询,需要1~2秒左右。

是否能进行速度优化呢? 还是说。这种数据不能实时查询,需要定时缓存?

阅读 4.5k
3 个回答

你现在的做法是把2天的数据一次性拉出来,数据量在2W+
然后去循环处理这2W+的数据,性能肯定快不到哪去

1、实时查询
你完全可以这样做,从日期时拆出小时字段进行聚合
select hour, count(1) from 表 where time>='2017-07-28' group by hour

如果性能还不理想,那就加一个hour字段并建立索引

2、允许延时
如对数据实时性要求不高可以定时计算存放到结果表,比如10分钟计算一次

像大盘线图一样,肯定不是每次查询出一天趋势数据,每次只需要到数据库查出该时间点的数据补充到缓存的数据中就好了

如果不是频发查询,每天的数据也就几万的级别,在数据库层面做汇总就可以了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题