У меня есть SQL-запрос с 4 UNIONS и 4 LEFT JOINS. Он изложен как таковой:
SELECT ... FROM table1 LEFT JOIN other_table1 UNION SELECT ... FROM table2 LEFT JOIN other_table2 UNION SELECT ... other_table3 LEFT JOIN other_table3 UNION SELECT ... FROM table4 LEFT JOIN other_table4
Было бы лучше запустить 4 отдельных запроса, а затем объединить результаты с php после факта? Или я должен держать их вместе? Что обеспечило бы самое быстрое исполнение?
Самый окончательный ответ – проверить каждый метод, однако, скорее всего, UNION
будет быстрее, поскольку MySQL использует только один запрос, а не 4 для каждой части объединения.
Вы также удаляете накладные расходы на чтение данных в память на PHP и их конкатенацию. Вместо этого вы можете просто сделать while()
или foreach()
или что-то еще на одном результате.
В этом случае это зависит от количества записей, которые вы собираетесь извлечь из результата. Поскольку вы используете левое соединение во всех объединениях, я предлагаю сделать другую выборку, чтобы избежать узкого места в SQL
и объединить результаты в PHP
Когда запрос выполняется с языка программирования, выполняются следующие шаги
Если вы выполняете N количество запросов, то над этими шагами происходит N раз, что, как вы можете догадаться, определенно замедлит процесс. Поэтому в идеале мы должны максимально сократить количество запросов.
Имеет смысл разбить запрос на несколько частей, если один запрос становится сложным, и его сложно поддерживать и занимает много времени для выполнения. В этом случае хорошим способом будет оптимизация самого запроса.
Как и в вашем случае, запрос довольно прост, и, как кто-то указал, что объединение также поможет удалить повторяющиеся строки, лучше всего перейти на SQL-запрос, чем PHP-код. Попробуйте методы оптимизации, такие как создание правильных индексов на таблицах.
Предложение UNION может быть быстрее, потому что оно будет возвращать сразу отдельные записи (дублированные записи не будут возвращены), иначе вам нужно будет сделать это в приложении. Кроме того, в этом случае это может помочь уменьшить трафик.
Из документации:
Поведение UNION по умолчанию состоит в том, что дубликаты строк удаляются из результата. Дополнительное ключевое слово DISTINCT не имеет никакого эффекта, кроме значения по умолчанию, поскольку оно также указывает удаление дубликатов строк. С необязательным ключевым словом ALL удаление дубликатов строк не происходит, и результат включает все соответствующие строки из всех операторов SELECT.
Вы можете смешать UNION ALL и UNION DISTINCT в том же запросе. Смешанные типы UNION обрабатываются таким образом, что объединение DISTINCT переопределяет любой союз ALL слева от него. Объединение DISTINCT можно получить явно, используя UNION DISTINCT или неявно, используя UNION без следующих ключевых слов DISTINCT или ALL.