我有一个简单的获取查询
key = TenantKey.objects.get(pk=api_key)
当我运行负载测试时,对于许多请求,上述查询需要花费数秒(最多 15 秒),这非常奇怪。所以我运行了一个与上面的 ORM 等效的原始 sql 查询,如下所示
with connection.cursor() as cursor:
cursor.execute("SELECT app_tenantkey.key_id, app_tenantkey.name FROM app_tenantkey WHERE app_tenantkey.value=%s",[key])
row = cursor.fetchone()
令人惊讶的是,这个查询比 ORM 快得多,这正是我们所期望的,因为表非常小,包含大约 20 个条目。
我还附加了两个查询的最大持续时间仅供参考
与类似情况下原始查询所花费的时间相比,ORM 查询花费的时间几乎是 100 倍。我想了解是什么导致 ORM 花费这么长时间而原始却很快。
我想出了问题所在,结果发现问题不在于 django 的 ORM。真正的问题是数据库的 DNS 名称解析。此查询是对数据库的第一个查询,这就是为什么只有这一行花了几秒钟而其他查询按预期运行的原因。