Должен ли я использовать один большой оператор SQL Select или несколько маленьких?

StackOverflow https://stackoverflow.com/questions/55463

Вопрос

Я создаю страницу PHP с данными, отправленными из MySQL.

Лучше ли иметь

  • 1 SELECT запрос с 4 объединениями таблиц или
  • 4 маленьких SELECT запросы без объединения таблиц;Я выбираю по идентификатору

Что быстрее и каковы плюсы и минусы каждого метода?Мне нужна только одна строка из каждой таблицы.

Это было полезно?

Решение

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

Убедитесь, что вы фильтруете вещи настолько хорошо, насколько это возможно, используя предложения «где» и «присоединиться».

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

Другие советы

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

Как правило, лучше иметь один оператор SELECT.Одна из основных причин использования баз данных заключается в том, что они быстро обрабатывают информацию, особенно если она имеет формат запроса.

Если и есть недостаток этого подхода, так это то, что некоторые виды анализа невозможно выполнить с помощью одного большого оператора SELECT.Пуристы РСУБД будут настаивать на том, что это проблема проектирования базы данных, и в этом случае вы вернетесь к моему первоначальному предложению.

Это может зависеть от того, что вы делаете с данными после получения их из БД.Если вы используете каждый из четырех результатов независимо, то было бы более логично и понятно иметь четыре отдельных оператора SELECT.С другой стороны, если вы используете все данные вместе, например, для создания единой строки в таблице или что-то в этом роде, я бы выбрал одиночные SELECT и JOIN.

Я немного поработал с PHP/MySQL и обнаружил, что даже для запросов к огромным таблицам с множеством JOINов база данных довольно хорошо оптимизируется - если у вас есть умные индексы.Так что, если вы серьезно относитесь к производительности, начните читать оптимизация и индексирование запросов.

Я бы сказал 1 запрос с объединением.Таким образом, вам нужно обратиться к серверу только один раз.А если ваши таблицы объединены индексами, это должно быть быстро.

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

Мы создавали выходной XML-файл с использованием хранимых процедур Java и определенно обнаружили, что время прохождения каждого отдельного запроса съедает нас заживо.Мы обнаружили, что гораздо быстрее получить все данные за минимальное количество запросов, а затем при необходимости подключить эти значения в XML DOM.

Единственным недостатком является то, что код Java был немного менее элегантным, поскольку теперь выборка данных была удалена от его использования.Но нам нужно было сгенерировать большой сложный XML-файл за минимально возможное время, поэтому нам пришлось оптимизировать скорость.

Однако будьте осторожны при работе с таблицей слияния.По моему опыту, хотя в большинстве ситуаций одиночное объединение может оказаться полезным, при использовании таблиц слияния можно столкнуться с странными ситуациями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top