Производительность SQL: что быстрее?IN () против JOIN - PullRequest
4 голосов
/ 02 ноября 2011

Это вопрос, на который я так и не получил окончательного ответа. Я использую MySQL в этом примере.

Учитывая достаточно большой набор значений (скажем, 500). Быстрее ли искать в таблице, используя эти значения с предложением IN ():

SELECT * FROM table WHERE field IN(values)

Или, создав временную таблицу в памяти, заполнив ее значениями и присоединив ее к таблице поиска:

CREATE TEMPORARY TABLE `temp_table` (`field` varchar(255) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO temp_table VALUES (values)

SELECT * FROM table t1 JOIN temp_table t2 ON t1.field = t2.field

Оба метода выдают одинаковый набор результатов.

Я провел некоторые из моих базовых тестов бенчмаркинга и обнаружил, что при работе с более чем 500 значениями становится быстрее использовать временную таблицу, чем предложение IN ().

Может ли кто-нибудь объяснить мне внутреннюю работу MySQL и как правильно ответить на этот вопрос?

Спасибо, Leo

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

Из онлайн-документации MySql, IN () :

IN (значение, ...)

Если все значения константы , они оцениваются по типу expr и сортируются.Поиск элемента затем выполняется с помощью бинарного поиска.Это означает, что IN очень быстр, если список значений IN полностью состоит из констант.В противном случае преобразование типов происходит в соответствии с правилами, описанными в разделе 11.2 «Преобразование типов в оценке выражений», но применяется ко всем аргументам.

Учитывая, что, по моему мнению, имеет смысл использовать IN () с набором констант, в противном случае вы должны использовать подзапрос в другой таблице.

Вы можете рассмотреть использование usign EXISTS () вместо JOIN, когда элементы извлекаются из другой таблицы, это значительнобыстрее для большого набора данных

SELECT * 
FROM table t1 
WHERE EXISTS 
      (
        SELECT * 
        FROM temp_table t2 
        WHERE t1.field = t2.field
      )
1 голос
/ 02 ноября 2011

Правильный ответ зависит от многих вещей.

Вы уже выполнили эту работу - если ваш бенчмаркинг говорит вам, что использовать временную таблицу быстрее, то это путь.

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

...