Производительность UNION против UNION ALL

Я выбираю один столбец внешних ключей из нескольких таблиц через UNION или UNION ALL.

Обычно рекомендуется использовать UNION ALL вместо UNION для проблем производительности, когда дубликаты не имеют значения. Однако в моем вызывающем PHP-скрипте было бы более эффективно проходить и манипулировать данными без дубликатов.

Итак, я могу использовать любую из следующих опций:

Опция 1:

Используйте UNION в базе данных для устранения дубликатов

Вариант 2:

используйте UNION ALL в базе данных и удалите данные в моем PHP-скрипте, используя array_unique () или другие подобные функции.

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

Правильно ли мое предположение в большинстве случаев? Если так, то почему? Если нет, то почему нет?

0

Решение

Главным аспектом является то, что UNION является сокращением для UNION DISTINCT и так

разница в производительности между UNION и UNION ALL связана с
нужно получить отличный результат и для этого ядро ​​базы данных и оптимизатор запросов
безусловно, более эффективны и эффективны, чем алгоритм фильтрации, основанный на PHP-коде в приложении.

Кроме того, продиктованная операция может выиграть от предварительной оптимизации группы по функциональности

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

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

1

Другие решения

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

Поэтому я рекомендую сказать UNION DISTINCT, поскольку это несколько нажатий клавиш для вас, чем array_unique(...),

Другие соображения:

  • UNION ALL переложит больше материала с сервера на клиент; это (в экстремальной или отдаленной ситуации) может быть фактором производительности.
  • Если вы также говорите, ORDER BY на UNIONВы можете также сделать DISTINCT, тоже.
  • GROUP BY (на UNION) имеет эффект DISTINCT,
  • Если вы говорите о миллионах строк, имейте в виду, что PHP может поразить ограничения памяти для массивов, тогда как MySQL по существу неограничен.
1

По вопросам рекламы [email protected]