SELECT * FROM table ГДЕ x IN (... несколько сотен дюймов ...) - PullRequest
2 голосов
/ 08 марта 2009

Таблица содержит около 8 миллионов строк. Существует неуникальный индекс для X.

Показывая индексы, он показывает, что в таблице есть неуникальный индекс по имени ключа X с "seq_in_index", равным 1, сличением A, количеством элементов 7850780, sub_part NULL, упакованным NULL, тип_индекса BTREE.

Тем не менее, этот запрос может занять 5 секунд. Список целых происходит из другой системы, и я не могу хранить их в таблице, потому что они представляют дружбу в социальной сети.

Есть ли более быстрый способ, чем массивный оператор IN?

Ответы [ 3 ]

12 голосов
/ 08 марта 2009

Вы можете преобразовать свой список идентификаторов в временную таблицу (или в таблицу var, если MySql их поддерживает) и присоединиться к ней.

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

5 голосов
/ 08 марта 2009

Вы можете попытаться сохранить их во временной таблице . Эта таблица не будет храниться в базе данных постоянно, и я думаю, что результирующее объединение (при условии, что вы также индексируете временную таблицу) будет быстрее, поскольку оно сможет обрабатывать индексы параллельно и не выполнять поиск индекса для каждого int в предложении IN. Разумеется, MySQL может оптимизировать предложение IN и делать то же самое, если знает, что будет использовать индекс, поэтому на самом деле может ничего не получить. Хотя я бы попробовал и посмотрел, быстрее ли это.

4 голосов
/ 08 марта 2009

Как предлагают другие, наиболее подходящим решением является временная таблица.

Имейте в виду, однако, что в зависимости от количества элементов и количества строк в вашей временной таблице / in () условие оптимизатор может по-прежнему прибегать к использованию последовательного сканирования, поскольку последовательное чтение может выполняться намного быстрее, чем множество случайный поиск в индексе.

На данный момент может быть целесообразно рассмотреть вопрос о перестройке отношений.

...