【问题标题】:Django query slow relative to raw SQL相对于原始 SQL,Django 查询速度较慢
【发布时间】: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


【解决方案1】:

我发现 Django 很好,但我的数据库很慢。一些psql 查询之所以很快,只是因为结果被缓存。请注意,即使psql 重新启动,似乎也有一些缓存。

因此,当您测试数据库的性能时,请确保查询没有被缓存。

最后没有必要使用原始 SQL 查询,因为 Django ORM 在性能方面似乎还不错。

【讨论】:

    猜你喜欢
    • 2015-11-21
    • 2012-03-16
    • 2015-05-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 2014-08-01
    • 2020-08-06
    • 2018-05-15
    相关资源
    最近更新 更多