Django查询相对于原始SQL较慢

5
我使用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日志。 - deathangel908
在内存中创建模型对象是需要付出代价的。使用"values" queryset并比较性能,对于一些大型queryset,它可以大大加快速度(而且由于你只是将模型转储为JSON,因此在内存中创建模型对象是没有意义的)。 - Paulo Scardine
@Andras 如果您已经解决了自己的问题,请考虑创建一个答案,这将对其他用户很有帮助。 - Rafael
1个回答

0

我发现 Django 运行良好,而是我的数据库运行缓慢。一些 psql 查询速度很快,只是因为结果被缓存了。请注意,即使重启了 psql,似乎仍然存在某种缓存。

所以,在测试数据库性能时,请确保查询未被缓存。

最后不必使用原始的 SQL 查询,因为 Django ORM 在性能方面表现良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接