Дано:
--
1) Таблица контактов, около 100К, с полями userid, id
userid - пользователь к которому принадлежит запись. id - то что нужно узнать.
2) Массив userid полученных из вне.
Проблема:
--
Если задано около 30К userid я использую выборку как:
select id from contacts where userid in (...)
на небольших выборках все нормально.
на 30К+ все клинит.
Мое решение:
--
1) Создается create temporary table _temp (id int, primary (`id`)
2) заполняется данными тех userid которые нужны (30к)
3) выборка делается как: select c.id from _temp t1 left join contacts c on t1.id=c.userid ...
С таким решением первые тесты показали себя очень хорошо, Локально пробовал на одной выборке . Время старого варианта 0.4, нового 0.01-0.02
Вопрос:
насколько оптимально данное решение.
Есть ли какие варианты получше?
Не так давно столкнулся с подобной задачей и пришел к такому же решению - создание временной таблицы, загрузка в нее данных через LOAD DATA INFILE, выполнение нужного запроса. Кстати, так же делаю, когда необходимо обновить большое кол-во строк (1К+) в какой-то таблице данными извне.