Какой процесс будет быстрее серверной работы или SQL-запрос? - PullRequest
1 голос
/ 14 марта 2019

Сценарий

Я работал над поисковой системой с Django 2 и MySQL.Поисковая система обращается к базе данных с параметром и составляет 4 таблицы запрос на присоединение.Это замедляет выполнение поиска для огромного количества данных.

Запрос:

itemViewCategory = Item.objects.raw("select *, company.slug as companySlug, company.name as companyName, field.id as fieldId, field.name as fieldName, category.name as categoryName from company inner join category on company.business_type = category.id inner join category_field on category_field.category_id = category.id inner join custom_field as field on category_field.field_id = field.id where category.id = (select id from category where slug= %s) and field.name LIKE %s order by company.name", [slug,product])

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

Я могу сделать это различными способами 2

  1. Сначала нужно использовать цикл for для подсчета этих данных.
  2. Или выполните другой запрос для подсчета этих данных.

Теперь у меня вопрос, какой процесс будет быстрее ?Я провел небольшое исследование, но не смог получить удовлетворительный ответ, и сейчас я в замешательстве.Может ли кто-нибудь помочь мне с этим запросом?

1 Ответ

1 голос
/ 20 марта 2019

База данных сможет оптимизировать счет лучше, если все, что вам нужно, это подсчет результата запроса и вам не нужен набор результатов.В этом случае, если вы выполните подсчет в python, базе данных придется сериализовать набор результатов, а python придется десериализовать его, что приводит к большому количеству ненужных циклов трафика и вычислений.

Однако, если вына самом деле нужен также набор результатов, тогда выполнение двух запросов (один для получения результата и один для подсчета), скорее всего, будет медленнее, чем просто выполнение одного запроса и подсчет на python, особенно если запрос медленный /сложный, и база данных не может выполнить подсчет индекса, поскольку база данных может фактически проходить через данные дважды.Кроме того, в зависимости от уровня изоляции транзакции выполнение двух запросов может фактически дать вам различное количество в двух запросах, если вы находитесь на уровне изоляции транзакции, который позволяет фантомное чтение, поскольку между двумя запросами могут быть добавлены / удалены строки.

В конечном счете, если вы обеспокоены этим, вам следует сравнить свои операции.

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