Выступление MYSQL "IN" - PullRequest
       3

Выступление MYSQL "IN"

23 голосов
/ 08 октября 2009

Я выполняю запрос MYSQL в два этапа.Сначала я получаю список идентификаторов с одним запросом, а затем извлекаю данные для этих идентификаторов, используя второй запрос в формате SELECT * FROM data WHERE id in (id1, id2 ...).Я знаю, это звучит глупо, но я сделал это таким образом, поскольку запросы очень сложны;первая включает в себя много геометрии и триггонометрии, вторая - много разных соединений.Я уверен, что они могут быть записаны в одном запросе, но мой MYSQL недостаточно хорош, чтобы его осуществить.

Этот подход работает, но он не чувствует правильным;плюс я обеспокоен тем, что он не будет масштабироваться.В данный момент я тестирую базу данных из 10 000 записей, с 400 идентификаторами в предложении «IN» (т.е. IN (id1, id2 ... id400)), и производительность в порядке.Но что, если есть, скажем, 1 000 000 записей?

Где существуют узкие места в производительности (скорость, память и т. Д.) Для этого вида запроса?Любые идеи о том, как реорганизовать этот вид запроса, тоже будут классными.(например, если стоит заняться хранимыми процедурами).

Ответы [ 2 ]

19 голосов
/ 08 октября 2009

Начиная с определенного количества записей, предикат IN для SELECT становится быстрее, чем для списка констант.

См. Эту статью в моем блоге для сравнения производительности:

Если столбец, используемый в запросе в предложении IN, проиндексирован, например:

SELECT  *
FROM    table1
WHERE   unindexed_column IN
        (
        SELECT  indexed_column
        FROM    table2
        )

, тогда этот запрос просто оптимизируется до EXISTS (который использует только одну запись для каждой записи из table1)

К сожалению, MySQL не способен сделать HASH SEMI JOIN или MERGE SEMI JOIN, которые еще более эффективны (особенно если оба столбца проиндексированы).

1 голос
/ 08 октября 2009

Почему вы сначала извлекаете идентификаторы? Вы, вероятно, должны просто присоединиться к столам. Если вы используете идентификаторы для чего-то другого, вы можете вставить их во временную таблицу и использовать эту таблицу для объединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...