Какой из следующих запросов вы бы сочли лучшим? Каковы ваши причины (эффективность кода, лучшая ремонтопригодность, меньше WTFery) ...
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
Ответы:
В худшем случае, когда вы смотрите на неиндексированное поле, использование MIN()
требует одного полного прохода таблицы. Использование SORT
и LIMIT
требует сортировки файлов. Если работать с большим столом, вероятно, будет значительная разница в воспринимаемой производительности. В качестве бессмысленной точки данных, MIN()
потребовалось 0,36 секунды SORT
и LIMIT
0,84 секунды против таблицы из 106000 строк на моем сервере разработки.
Однако если вы смотрите на индексированный столбец, разницу заметить труднее (бессмысленная точка данных составляет 0,00 с в обоих случаях). Однако, глядя на вывод объяснения, похоже, что MIN()
он может просто извлечь наименьшее значение из индекса (`` Выбрать таблицы, оптимизированные '' и `` NULL '' строки), тогда как SORT
и LIMIT
все еще необходимо выполнить упорядоченный обход индекса. (106000 строк). Фактическое влияние на производительность, вероятно, незначительно.
Похоже, MIN()
это правильный путь - он быстрее в худшем случае, неотличим в лучшем случае, является стандартным SQL и наиболее четко выражает ценность, которую вы пытаетесь получить. Единственный случай, когда кажется, что использование SORT
и LIMIT
было бы желательным, - это, как упоминалось в mson , когда вы пишете общую операцию, которая находит верхние или нижние значения N из произвольных столбцов, и не стоит записывать операцию специального случая.
SELECT MIN(`field`)
FROM `tbl`;
Просто потому, что он совместим с ANSI. Ограничение 1 характерно для MySql, как TOP для SQL Server.
Как отметили mson и Sean McSomething , MIN предпочтительнее.
Еще одна причина, по которой ORDER BY + LIMIT полезен, - это если вы хотите получить значение столбца, отличного от столбца MIN.
Пример:
SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1
Думаю, ответы зависят от того, что вы делаете.
Если у вас есть одноразовый запрос и цель настолько проста, насколько вы указали, предпочтительнее выбрать min (поле).
Однако обычно эти типы требований меняются на - захват первых n результатов, захват n-го - m-го результатов и т. Д.
Я не думаю, что идея использовать выбранную вами базу данных слишком ужасна. Изменение dbs не должно происходить легкомысленно, и необходимо пересмотреть цену, которую вы платите, когда делаете этот ход.
Зачем ограничивать себя сейчас, потому что боль вы можете почувствовать или не почувствовать позже?
Я думаю, что лучше оставаться в стандарте ANSI, насколько это возможно, но это всего лишь рекомендация ...
Учитывая приемлемую производительность, я бы использовал первый, потому что он семантически ближе к цели.
Если производительность была проблемой (большинство современных оптимизаторов, вероятно, оптимизируют оба по одному и тому же плану запроса, хотя вы должны проверить это, чтобы убедиться в этом), то, конечно, я бы использовал более быстрый.