Производительность 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» просматривает все строки