Производительность MySQL – позиция «IN» против равных (=) для одного значения
Это довольно простой вопрос, и я предполагаю, что ответ «Это не имеет значения», но я все равно должен спросить …
У меня есть обобщенная инструкция sql, встроенная в PHP:
$sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')';
Принимая предыдущие проверки достоверности ( $object_ids
– это массив с не менее чем одним элементом и всеми численными значениями), должен ли я сделать следующее вместо этого?
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) . ')'; }
} else {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 Solutions collect form web for “Производительность MySQL – позиция «IN» против равных (=) для одного значения”
Ни один из них не имеет большого значения в большом объеме вещей. Задержка в сети при общении с базой данных значительно перевешивает накладные расходы count($object_ids)
или накладные расходы =
vs 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 является всего лишь одним элементом. Не беспокойтесь.
Запустите два запроса с помощью инструкции объяснения. Это покажет вам, что делает MySQL. Вы сосредотачиваетесь на оптимизации MySQL, должно быть на том, что делает MySQL с внутренним запросом. Попытка оптимизировать, какой запрос выполняется, немного преждевременна.
Оба эти запроса могут быть ужасными в производительности, если нет индекса, например. Инструкция MySQL EXPLAIN – золото здесь. Поэтому, когда вы дойдете до запроса, который работает медленно, оператор EXPLAIN покажет вам, почему.
Я предполагаю, что внутренне mysql будет обрабатывать запрос IN (6)
точно так же, как запрос a = 6
поэтому нет необходимости беспокоиться (кстати, это называется преждевременной оптимизацией)
Я запускаю запрос с объяснением, и вот результаты
Очевидно, что оператор «Равно» лучше, он сканирует 13 строк, а «IN» просматривает все строки