Производительность MySQL - Пункт "В" против Равно (=) для одного значения [дубликат]
На этот вопрос уже есть ответ здесь:
Это довольно простой вопрос, и я предполагаю, что ответ "Это не имеет значения", но я все равно должен спросить...
У меня есть общий оператор sql, встроенный в PHP:
$sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')';
Предполагая, что до проверки достоверности ($object_ids
- это массив, содержащий по крайней мере 1 элемент и все числовые значения), должен ли я вместо этого сделать следующее?
if(count($object_ids) == 1) {
$sql = 'SELECT * FROM `users` WHERE `id` = ' . array_shift($object_ids);
} else {
$sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')';
}
Или накладные расходы на проверку count($object_ids)
не стоят того, что было бы сохранено в фактической инструкции sql (если таковая вообще имеется)?
6 answers
Ни один из них на самом деле не имеет значения в широком масштабе вещей. Задержка в сети при обмене данными с базой данных значительно перевесит либо накладные расходы count($object_ids)
, либо накладные расходы =
по сравнению с IN
. Я бы назвал это случаем преждевременной оптимизации.
Вам следует профилировать и тестировать приложение под нагрузкой, чтобы узнать, где находятся реальные узкие места.
Большинство других ответов не дают ничего убедительного, просто предположения. Итак, основываясь на хорошем совете из ответа @Namphibian, я запустил EXPLAIN
по некоторым запросам, аналогичным тем, которые были в OP.
Результаты приведены ниже:
EXPLAIN
для запроса с = 1
:
EXPLAIN
для запроса с IN(1)
:
EXPLAIN
для запроса с IN(1,2,3)
:
Как вы можете видеть, MySQL оптимизирует IN(1)
, чтобы быть таким же, как = 1
в такого рода запросах. Ответ @mes, похоже, указывает на то, что это не всегда может быть так с более сложными запросами, однако.
Итак, для тех, кто был слишком ленив, чтобы запустить EXPLAIN
самостоятельно, теперь вы знаете. И да, вы можете захотеть запустить EXPLAIN
в своем собственном запросе, чтобы убедиться, что он обрабатывается таким образом. :-)
Нет никакой разницы между инструкциями MySQL, и оптимизатор MySQL преобразует IN в =, когда IN - это всего лишь один элемент. Не беспокойтесь.
Выполните два запроса с инструкцией explain. Это покажет вам, что делает MySQL. Вы фокусируетесь на оптимизации MySQL, которая должна быть направлена на то, что MySQL делает с запросом внутри. Пытаться оптимизировать, какой запрос выполняется, немного преждевременно.
Оба этих запроса могут быть ужасными по производительности, если, например, нет индекса. Объяснение MySQL здесь - золото. Поэтому, когда вы доберетесь до запроса, который выполняется медленно, инструкция EXPLAIN покажет вам, почему.
Я полагаю, что внутренне mysql будет обрабатывать запрос IN (6)
точно так же, как запрос = 6
, поэтому нет необходимости беспокоиться (кстати, это называется преждевременной оптимизацией)
Я запускаю запрос с инструкцией explain, и вот результаты
Очевидно, что оператор "Равно" лучше, он сканирует 13 строк, а "В" сканирует все строки