Django中的第一个查询总是很慢

时间:2019-07-08 07:43:58

标签: sql django mariadb

我有一个简单的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. */

1 个答案:

答案 0 :(得分:1)

根据设置,请求完成后,可能会关闭与数据库的连接。 CONN_MAX_AGE设置为0时就是这种情况。结果,对于每个请求,都必须建立一个新的连接。

例如,您可以将CONN_MAX_AGE设置为60,这样就可以重用上一个请求打开的连接,从而避免了这种开销。您服务器的第一个查询可能仍然有些慢,但是以下请求中的查询通常会更快。