Минута / Макс против заказа мимо и предела


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

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

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

5 ответов:

в худшем случае, когда вы смотрите на неиндексированное поле, используя MIN() требуется один полный проход по таблице. Используя SORT и LIMIT требуется filesort. Если вы столкнетесь с большой таблицей, вероятно, будет значительная разница в получаемой производительности. Как бессмысленная точка данных,.36С в то время как SORT и LIMIT взял .84s против таблицы строк 106,000 на моем сервере dev.

Если, однако, вы смотрите на индексированный столбец, в разница труднее заметить (бессмысленная точка данных составляет 0,00 С в обоих случаях). Глядя на выход объяснить, однако, это выглядит так:MIN() может просто вырвать наименьшее значение из индекса ("выберите таблицы, оптимизированные прочь" и "нулевые" строки), тогда как SORT и LIMIT по-прежнему необходимо выполнить упорядоченный обход индекса (106 000 строк). Фактическое влияние на производительность, вероятно, незначительно.

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

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

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

Как mson и Sean McSomething указал, мин предпочтительнее.

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

пример:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1

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

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

тем не менее, обычно эти типы требований меняются на - захватите верхние результаты n, захватите результаты nth - mth и т. д.

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

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

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

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