
diango orm 查询 postgres 数据库一张表,从 1 亿数据中查询,有个条件会查到 600 多万条数据,我要对查到的数据集做遍历生成需要的格式。这个过程大概需要 70 到 80 秒。由于查到的数据要图像化到前端,这个等待过程有点太长。
for al in res: bytes_list.append(al['in_bytes'] + al['out_bytes']) packets_list.append(al['in_pkts'] + al['out_pkts']) time_list.append(al['start_time']).strftime("%Y-%m-%d %H:%M:%S")) res 就是得到的 queryset,下面*__list 是三个空列表
1 leishi1313 2019 年 8 月 5 日 via Android 你这条 for 可以用 sql 直接得到结果。然后查询这么慢的话可以放缓存。 |
2 009694 2019 年 8 月 5 日 bytes_list = [al['in_bytes'] + al['out_bytes'] for al in res] packets_list = [al['in_pkts'] + al['out_pkts'] for al in res] time_list = [al['start_time'].strftime("%Y-%m-%d %H:%M:%S") for al in res] |
3 ankazen 2019 年 8 月 5 日 为什么一次性需要这么多数据呢?是不是需要设计中间层去存储查新结果? |
4 dapengzhao OP @009694 这样写用时 75 秒,跟之前的 for 循环差不多 |
5 dapengzhao OP @leishi1313 有点没看懂你的意思是说可以在 sql 里面就得到想要的结果?然后说先将结果放缓存我理解成 res = [r for r in res]这样先存起来再查?这样的话分别用时 33 秒,45 秒和直接 for 循环也差不多 |
6 dapengzhao OP @ankazen 因为查询条件是用户选择的,选的查询条件越少查出来的数据就越多 |
7 misaka19000 2019 年 8 月 5 日 一次查询 600 万条数据?你这个简单,改需求 |
8 dapengzhao OP @misaka19000 好嘞哥 |
9 pkuphy PRO list(res .annotate( bytes=F('in_bytes')+F('out_bytes'), packets=F('in_pkts')+F('out_pkts') ).values( 'bytes', 'packets', 'start_time' ) ) |
10 leishi1313 2019 年 8 月 5 日 via Android @dapengzhao sql 里也可以计算吧,select val1+val2,psql 也能直接对 datetime 进行格式化操作,照着#9 的做就好,你这一整个 for 是完全可以放在数据库做的。再说了拿 python 的 list append 600 多万条数据也太难为人了,后面这些数据要聚合的话试试 generator 吧。还有你前端不要分页的吗一次拿那么多数据 |
11 dapengzhao OP @leishi1313 我也在想要把这个过程写成存储过程,前端只要 list 就行,画两个散点图 |
12 wzwwzw 2019 年 8 月 5 日 曲线救国,把计算好的数据放到缓存,开个线程在后台几分钟计算一下。 |
13 leishi1313 2019 年 8 月 6 日 @dapengzhao 我不是建议存储过程啊,我意思跟#9 差不多,你这可以用一条 query 直接在数据库查询出来的,用 Django 可以看看 annotate 和 extra 这两个就可以达到你的效果了 |
14 wd 2019 年 8 月 6 日 via iPhone 提前把所有可能算出来存好 |