我有一个简单的Django应用,只有两个模型和一个视图。 每当我查询数据库时,第一个查询总是花费大约一秒钟,此后的任何查询几乎都是瞬时的。
我的视图如下:
def my_view(request):
start = time.time()
print('0', time.time() - start)
a = TestClass.objects.get(name="test")
print('1', time.time() - start)
b = TestCustomer.objects.get(name="test")
print('2', time.time() - start)
return render(request, 'test.html', {})
运行它时,得到以下输出:
0 0.0
1 1.0049302577972412
2 1.0059285163879395
这意味着第一个查询比第二个查询要慢得多。
如果我注释掉第一个查询(TestClass
查询),则会得到以下输出:
0 0.0
1 0.0
2 1.0183587074279785
意味着TestCustomer查询突然变慢了很多。
两种模型都只有一个字段(name
,这是一个CharField)。
为什么第一个查询总是这么慢?我尝试禁用Debug,但这没什么区别。如果我绕过Django直接运行查询,它们是瞬时的:
SELECT `customers_testcustomer`.`id`,
`customers_testcustomer`.`name`
FROM `customers_testcustomer`
WHERE `customers_testcustomer`.`name` = 'test';
/* Affected rows: 0 Found rows: 1 Warnings: 0 Duration for 1 query: 0,000 sec. */
答案 0 :(得分:1)
根据设置,请求完成后,可能会关闭与数据库的连接。 CONN_MAX_AGE
设置为0
时就是这种情况。结果,对于每个请求,都必须建立一个新的连接。
例如,您可以将CONN_MAX_AGE
设置为60
,这样就可以重用上一个请求打开的连接,从而避免了这种开销。您服务器的第一个查询可能仍然有些慢,但是以下请求中的查询通常会更快。