Минута / Макс против заказа мимо и предела
из следующих запросов, какой метод вы считаете лучшим? Каковы ваши причины (эффективность кода, лучшая ремонтопригодность, меньше WTFery)...
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
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 как можно больше, но это просто руководство...
учитывая приемлемую производительность, я бы использовал первый, потому что он семантически ближе к намерению.
Если бы производительность была проблемой (большинство современных оптимизаторов, вероятно, оптимизируют оба в один и тот же план запроса, хотя вам нужно проверить это), то, конечно, я бы использовал более быстрый.