2014-01-07 2 views
1

Я убираю чужой код. При переходе через очень сложную систему, которая генерирует очень сложные запросы SQL, я вижу много использования ИН() ИНЕКЕ:MySQL 5.5: лучше ли использовать IN (...) или серию EQUALS-AND?

SELECT * FROM table 
WHERE field1 IN(1, 2, 3, 4, 5) 
    AND type IN(1, 2, 3) 

... и так далее. Является ли это лучше для производительности, чтобы собрать серию field = 1 OR field = 2 OR... так:

SELECT * FROM table 
WHERE (field1 = 1 OR field1 = 2 OR field1 = 3 OR field1 = 4 OR field1 = 5) 
    AND (type = 1 OR type = 2 OR type = 3) 

или лучше использовать IN()? Даже для одного значения, такого как type IN(1)?

+0

Отметьте 'EXPLAIN' для обоих. «который генерирует очень сложные SQL-запросы» - неужели вы уверены, что изменили их на самом деле? – zerkms

+0

@zerkms: Использование EXPLAIN не показывает разницы. Включение профилирования в phpMyAdmin генерирует совершенно разные результаты. – user2624632

ответ

3

Ответ зависит от версии MySQL. Разработчики работали над улучшением оптимизатора с каждым крупным выпуском, поэтому эффективность OR против IN может быть совсем иной в MySQL 5.6 или новее. Это также зависит от того, сколько терминов мы говорим, и избирательности индекса и так далее.

Лучшим советом является тестирование и просмотр ваших реальных запросов на вашей установленной версии MySQL с использованием реальных данных.

+0

Спасибо за подсказку. – user2624632

0

Лучше использовать IN для удобства чтения и обслуживания. Производительность будет одинаковой, если не лучше. Фактически, вы, вероятно, получите повышение производительности сервером, которому не нужно разбирать смешной список или ... или ... или вздор. Помните, что сервер не просто запускает SQL, он должен разбирать его и понимать. Более читаемые для нас люди более читабельны для сервера и, таким образом, анализируются быстрее.

+1

«Более читаемые для нас люди более читабельны для сервера» --- это никогда не бывает. – zerkms

+0

@developerwjk: Хорошая точка в читаемости. Но поскольку я собираю строку запроса SQL в цикле, читаемость не будет иметь большого значения. – user2624632

+0

@zerkms, Никогда здесь не очень сильное слово. Потому что в этом случае, безусловно, проще для обеих сторон. Возможно, это не всегда верно, но здесь. – developerwjk

Смежные вопросы