首页 > 解决方案 > 相对于原始 SQL,Django 查询速度较慢

问题描述

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重新启动,似乎也有一些缓存,这可能会混淆性能测试。

标签: django

解决方案


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

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

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


推荐阅读