MIN / MAX против ORDER BY и LIMIT - PullRequest
       21

MIN / MAX против ORDER BY и LIMIT

80 голосов
/ 09 января 2009

Из следующих запросов, какой метод вы считаете лучшим? Каковы ваши причины (эффективность кода, лучшая поддержка, меньше WTFery) ...

SELECT MIN(`field`)
FROM `tbl`;

SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;

Ответы [ 5 ]

111 голосов
/ 09 января 2009

В худшем случае, когда вы смотрите на неиндексированное поле, использование MIN() требует одного полного прохода таблицы. Использование SORT и LIMIT требует сортировки файлов. При запуске с большой таблицей, вероятно, будет существенная разница в воспринимаемой производительности. В качестве бессмысленной точки данных MIN() потребовалось 0,36 с, а SORT и LIMIT - 0,84 против таблицы строк 106 000 на моем сервере dev.

Однако, если вы смотрите на индексированный столбец, разницу заметить труднее (бессмысленная точка данных равна 0,00 с в обоих случаях). Однако, смотря на вывод команды объяснения, похоже, что MIN() может просто извлечь наименьшее значение из индекса (строки «Выбранные таблицы оптимизированы» и «NULL»), тогда как SORT и LIMIT все еще нужны необходимо выполнить упорядоченный обход индекса (106 000 строк). Фактическое влияние на производительность, вероятно, незначительно.

Похоже, что MIN() - это путь, который в худшем случае быстрее, неотличим в лучшем случае, это стандартный SQL и наиболее четко выражает значение, которое вы пытаетесь получить. Единственный случай, когда кажется, что было бы желательно использовать SORT и LIMIT, был бы, как упомянуто mson , где вы пишете общую операцию, которая находит верхнее или нижнее N значений из произвольных столбцов и не стоит выписывать специальную операцию.

11 голосов
/ 09 января 2009
SELECT MIN(`field`)
FROM `tbl`;

Просто потому, что он совместим с ANSI. Ограничение 1 относится к MySql, а TOP относится к SQL Server.

7 голосов
/ 16 октября 2013

Как отметили мсон и Шон Максомет , МИН является предпочтительным.

Еще одна причина, по которой полезно ORDER BY + LIMIT, заключается в том, что вы хотите получить значение столбца, отличного от столбца MIN.

Пример:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1
3 голосов
/ 09 января 2009

Я думаю, что ответы зависят от того, что вы делаете.

Если у вас 1 запрос на отключение и намерение такое же простое, как вы указали, предпочтительным является выбор min (поле).

Тем не менее, эти типы требований часто заменяются на получение лучших результатов, получение десятых результатов и т. Д.

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

Зачем ограничивать себя сейчас, от боли вы можете или не можете чувствовать позже?

Я думаю, что хорошо оставаться ANSI как можно дольше, но это всего лишь руководство ...

2 голосов
/ 09 января 2009

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

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