Производительность MySQL – позиция «IN» против равных (=) для одного значения

Это довольно простой вопрос, и я предполагаю, что ответ «Это не имеет значения», но я все равно должен спросить …

У меня есть обобщенная инструкция sql, встроенная в PHP:

  • PHP / Curl: HEAD Request занимает много времени на некоторых сайтах
  • Как я могу использовать код C ++ для взаимодействия с PHP?
  • Будет ли XDebug на производственном сервере делать PHP медленнее?
  • Хранимая процедура MySQL или сложный запрос
  • PHP: ускоритель JSON или XML?
  • быстрый поиск строк в 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-заявлении (если оно вообще есть)?

  • Получение последнего идентификатора вставки из MySql с помощью PHP
  • Отладка PDO - просмотр запроса ПОСЛЕ привязки?
  • Хеширование пароля с использованием crypt не работает при входе в систему, на котором отображается неправильный пароль
  • Как предотвратить множественные экземпляры скрипта?
  • Как я могу написать SQL для таблицы с таким же именем, как защищенное ключевое слово в MySql?
  • PHP - запрос MySQL с разбиением на страницы
  • 6 Solutions collect form web for “Производительность MySQL – позиция «IN» против равных (=) для одного значения”

    Ни один из них не имеет большого значения в большом объеме вещей. Задержка в сети при общении с базой данных значительно перевешивает накладные расходы count($object_ids) или накладные расходы = vs IN . Я бы назвал это случаем преждевременной оптимизации.

    Вы должны профилировать и загружать тестовое приложение, чтобы узнать, где находятся настоящие узкие места.

    Большинство других ответов не дают ничего убедительного, просто спекуляции. Итак, основываясь на хорошем совете от ответа @ Namphibian , я запускал EXPLAIN по некоторым запросам, подобным тем, которые были в OP.

    Результаты приведены ниже:


    EXPLAIN для запроса с = 1 :

    Объясните для запроса с помощью <code> = 1 </ code>


    EXPLAIN для запроса с IN(1) :

    Объясните для запроса с помощью <code> IN (1) </ code>


    EXPLAIN для запроса с IN(1,2,3) :

    Объясните для запроса с помощью <code> IN (1,2,3) </ code>


    Как вы можете видеть, MySQL оптимизирует IN(1) чтобы быть таким же, как = 1 в этом типе запроса. Ответ @ mes, похоже, указывает на то, что это может не всегда быть в случае с более сложными запросами.

    Таким образом, для тех, кто слишком ленив, чтобы управлять самим EXPLAIN , теперь вы знаете. И да, вы можете запустить EXPLAIN в своем собственном запросе, чтобы убедиться, что он обрабатывается таким образом. 🙂

    Нет никакой разницы между операторами MySQL, и оптимизатор MySQL преобразует IN в значение =, когда IN является всего лишь одним элементом. Не беспокойтесь.

    Запустите два запроса с помощью инструкции объяснения. Это покажет вам, что делает MySQL. Вы сосредотачиваетесь на оптимизации MySQL, должно быть на том, что делает MySQL с внутренним запросом. Попытка оптимизировать, какой запрос выполняется, немного преждевременна.

    Оба эти запроса могут быть ужасными в производительности, если нет индекса, например. Инструкция MySQL EXPLAIN – золото здесь. Поэтому, когда вы дойдете до запроса, который работает медленно, оператор EXPLAIN покажет вам, почему.

    Я предполагаю, что внутренне mysql будет обрабатывать запрос IN (6) точно так же, как запрос a = 6 поэтому нет необходимости беспокоиться (кстати, это называется преждевременной оптимизацией)

    Я запускаю запрос с объяснением, и вот результаты введите описание изображения здесь

    Очевидно, что оператор «Равно» лучше, он сканирует 13 строк, а «IN» просматривает все строки

    PHP is the Best Programming Language in the world.