Производительность/эффективность двух операторов SELECT по сравнению с UNION по сравнению с чем-либо еще в MySQL-PHP

Что является более эффективным/лучшей практикой/менее затратным в MySQL (с PHP)? SELECTобъединение двух отдельных операторов, UNIONобъединение их в одно, или что-то еще, что я нашел в Интернете о CREATEобработке временной таблицы как MySQL-эквивалента SELECT INTO? Или что-нибудь еще, что вы можете придумать?

Результат будет использован в PHP-скрипте.

Запросы:

  • Первый SELECT (назовем его Запрос A) всегда будет давать 10 строк, 4 столбца, несмотря ни на что.
  • Второй SELECT (запрос B) всегда будет давать 1 строку, 4 столбца, несмотря ни на что.

Сценарии:

  • Если я SELECT два оператора, я буду повторять запрос B, только если Query A[0]->Col1 > 0: всего 2 запроса БД + обработка PHP.
  • Если я UNION включу два оператора в запрос C таким образом, что запрос B будет первой строкой (Query C[0] — это запрос B), а запрос A — строками 2-11 (Query C[1..10] — это запрос A), я буду повторять только строки 2- 11, если Query C[0]->Col1 > 0: всего 1 запрос БД + обработка PHP.

Не подлежит обсуждению:

  • Я должен перебирать запрос A, несмотря ни на что.
  • Итерация запроса A зависит от значения запроса B.

Стоит ли запрос SELECT на 1 меньше операции UNION? Есть ли более эффективное/лучшая практика/менее затратное решение? Что-нибудь, что мне здесь не хватает? Заранее спасибо.


person Ana Ban    schedule 21.04.2012    source источник
comment
Я сомневаюсь, что есть большая ценность в оптимизации двух запросов, которые возвращают всего 11 строк...   -  person mellamokb    schedule 21.04.2012
comment
хм... так что нет большой разницы между запуском одного mysql_result с запросом UNIONed и запуском 2 mysql_result, когда всего строк результатов всего 11? в конце концов, что вы предлагаете мне пойти тогда? большое спасибо, @mellamokb   -  person Ana Ban    schedule 21.04.2012


Ответы (1)


Это полностью зависит от окружающей среды и того, как вы управляете — я должен сказать — от всего остального. Если сервер находится в другой сети, на другом конце планеты, сеть является вашим узким местом.
Чтобы сделать звонок более точным, я бы сделал несколько предположений: сервер находится на локальном хосте, соединения управляются должным образом, и следует оптимизировать только сам запрос. Если это так, вы можете использовать команду Explain, как описано здесь. очень просто:

Explain select col1 from table1 Union select col2 from table2

Существует множество статей, объясняющих, как использовать Explain. вот.

И последнее, важно не только количество строк. Также важно, сколько раз выполняется выбранный вами код. Предположим, у вас есть цикл, который возвращает 11 строк при каждом запуске и имеет 1000 итераций. Просто предположим, что строки различны в каждой итерации, тогда вы увидите эффект от управления вашим соединением и кэширования.

person Jermin Bazazian    schedule 21.04.2012
comment
теперь больше похоже. да, это для стандартного развертывания, ничего особенного. спасибо спасибо за это. для этого конкретного веб-приложения он будет вызываться только один раз для каждой страницы. однако количество вызовов страницы определенно должно хорошо масштабироваться. Я поищу объяснение и проверю, что хорошего он может предложить. огромное спасибо! обновлю этот вопрос, как только я наконец решу, что делать. ты молодец, @Jermin - person Ana Ban; 21.04.2012
comment
k, так что в итоге я использовал UNION. определенно стоит того для масштабирования запросов страниц. - person Ana Ban; 22.04.2012