Первый запрос в Django всегда медленный - PullRequest
2 голосов
/ 08 июля 2019

У меня есть простое приложение 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).

Почему первый запрос всегда намного медленнее?Я пытался отключить отладку, но это не имеет значения.И если я запускаю запросы напрямую, в обход 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 Ответ

1 голос
/ 08 июля 2019

В зависимости от настроек, соединение с базой данных может быть закрыто после завершения запроса. Это тот случай, когда CONN_MAX_AGE установлено на 0. В результате для каждого запроса необходимо установить новое соединение.

Например, вы можете установить CONN_MAX_AGE на 60, чтобы вы могли повторно использовать соединение, открытое по предыдущему запросу, и таким образом избежать этих издержек. Самый первый запрос вашего сервера может все еще быть немного медленным, но запросы в следующих запросах обычно будут быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...