Django: ускорьте загрузку страницы, автоматически выполняя сложные запросы в течение ночи и сохраняя результат в небольшой таблице поиска.

Я создаю веб-приложение, похожее на панель инструментов, в Django, и мое представление загружается вечно из-за относительно большой базы данных (одна таблица с 60 000 строк ... и растет), сложности запросов и большого количества хруста чисел и обработка данных в python, согласно панели инструментов отладки django, для загрузки страницы требуется 12 секунд.

Чтобы ускорить время загрузки страницы, я подумал о следующем решении:

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

Поскольку запросы из первого представления выполняются каждую ночь, данные в таблице поиска всегда актуальны.

Мои вопросы: имеет ли смысл моя идея, и если да, есть ли у кого-нибудь опыт с таким подходом? Как я могу написать представление, которое автоматически вызывается каждую ночь?

Я тоже читал про кеширование, но с кешированием первая загрузка страницы после обновления базы все равно занимает очень много времени, а данные в базе регулярно обновляются


person Daniel    schedule 10.12.2019    source источник
comment
Я бы сначала посмотрел, почему запросы занимают так много времени. 60000 строк - это не большая таблица. Обычная база данных MySQL или PostgreSQL может легко обрабатывать миллионы строк. Правильно ли вы проиндексировали свои таблицы для запросов, которые вы делаете?   -  person dirkgroten    schedule 10.12.2019
comment
Но да, запуск ночных запросов возможен и является обычной практикой. Вы можете использовать crontab для запуска команды управления django (которая выполняет запросы) или запускать что-то более сложное, например, django-celery.   -  person dirkgroten    schedule 10.12.2019
comment
Как говорит @dirkgroten, оптимизируйте свои запросы. В частности, попробуйте хотя бы prefetch_related/select_related, а затем попробуйте проиндексировать столбцы поиска. 60к это не большая таблица.   -  person Airith    schedule 10.12.2019


Ответы (1)


Да, это обычная практика.

Мы предварительно вычисляем некоторые вещи и используем celery для выполнения этих задач ежедневно около полуночи. Для некоторых вещей у нас есть специальная новая модель, но обычно мы добавляем в модель столбцы базы данных, которые содержат предварительно рассчитанную информацию.

Этот подход в основном не имеет ничего общего с представлениями — вы используете их как обычно, просто по-разному обращаетесь к данным.

person K.H.    schedule 10.12.2019