【发布时间】:2018-11-01 09:35:57
【问题描述】:
我使用matches.query.__format__('') 打印 Django 查询将执行的原始 SQL。
如果我直接在psql 中执行该查询,则需要 5-10 毫秒,而下面定时的 Django 查询在第一次执行时可能需要 100 毫秒。
损失 100 毫秒很多(必须运行第二个查询 - 所以这是 2 x 100 毫秒 - 添加延迟并且用户很容易注意到)。这是正常的吗?我错过了什么吗?
def api(request):
tag = request.GET.get('q', '')
matches = Relationship.objects.filter(keyword=tag, count__gte=3).order_by('-count')[:30]
print(matches.query.__format__('')) # get raw SQL query here
start_time = time.time()
print(matches) # lazy query executed here
print("Time elapsed {0:0.1f}ms".format((time.time() - start_time) * 1000))
mydict = serialize_matches(matches, tag)
return JsonResponse(mydict)
更新:
感谢以下提示。 Django 看起来不错,毕竟是数据库慢。我的一些psql 查询非常快,因为结果已经被缓存了。即使重新启动psql 似乎也有一些缓存,这可能会混淆性能测试。
【问题讨论】:
-
请求执行了 100 毫秒还是只是查询? Django 还可以使用自动提交,在查询之前运行
start transaction,在查询之后运行commit,如果这是唯一正在执行的查询,请检查 postgres 日志 -
在内存中创建模型对象是有代价的。使用"values" queryset 并比较性能,对于一些大型查询集,它可以大大加快速度(而且由于您只是将模型转储为 JSON,因此在内存中为模型创建付费是没有意义的)。
-
@Andras 如果您解决了自己的问题,请考虑自己创建一个答案,您的发现将对其他用户有用。
标签: django