SELECT * FROM table ГДЕ x IN (... несколько сотен дюймов...)
Таблица насчитывает около 8 миллионов строк. Существует неуникальный индекс для X.
Показывая индексы, он показывает, что в таблице есть неуникальный индекс по имени ключа X с "seq_in_index", равным 1, сличением A, мощностью 7850780, sub_part NULL, упакованным NULL, index_type BTREE.
Тем не менее, этот запрос может занять 5 секунд. Список целых происходит из другой системы, и я не могу хранить их в таблице, потому что они представляют дружбу в социальной сети.
Есть ли более быстрый способ, чем массивный оператор IN?
3 ответа
Вы можете преобразовать свой список идентификаторов в временную таблицу (или в таблицу var, если MySql их поддерживает) и присоединиться к ней.
Таблица будет жить так же долго, как и запрос, так что вы на самом деле ничего не храните в таблице.
Вы можете попытаться сохранить их во временной таблице. Эта таблица не будет храниться в базе данных постоянно, и я думаю, что результирующее объединение (при условии, что вы также индексируете временную таблицу) будет быстрее, поскольку оно сможет обрабатывать индексы параллельно и не выполнять поиск индекса для каждого int в предложении IN. Конечно, MySQL может оптимизировать предложение IN и делать то же самое, если знает, что будет использовать индекс, поэтому на самом деле может ничего не получить. Я хотел бы попробовать и посмотреть, если это быстрее.
Как полагают другие, временная таблица является наиболее подходящим решением.
Имейте в виду, однако, что в зависимости от количества элементов и количества строк в вашей временной таблице /in() условие оптимизатор может по-прежнему прибегать к использованию последовательного сканирования, потому что последовательное чтение может быть намного быстрее, чем множество случайных поисков в индекс.
На данный момент может быть целесообразно рассмотреть вопрос о перестройке отношений.