Я читал, что создание временной таблицы лучше, если количество параметров, переданных в критериях IN, велико. Это для выбранных запросов. Это верно для запросов на обновление? У меня есть запрос на обновление, который использует 3 объединения таблиц (Inner Joins) и передает 1000 параметров в критериях IN, и этот запрос выполняется в цикле 200 или более раз. Каков наилучший подход для выполнения этого запроса?IN Критерий производительности для операции обновления в MySQL
ответ
IN
операции обычно медленные. Передача 1000 параметров на любой запрос звучит ужасно. Если вы можете этого избежать, сделайте это. Теперь, я бы действительно пошел с temp-таблицей. Вы даже можете играть с индексированием таблицы. Я имею в виду, вместо того, чтобы просто вкладывать в него значения, играйте с индексами, которые помогут вам оптимизировать ваши поиски.
С другой стороны, добавление индексами происходит медленнее, чем добавление без индексов. Пойдите для эмпирического испытания там. Теперь, я думаю, необходимо, помните, что при использовании другой таблицы вам не нужно использовать предложение IN
, потому что вы можете использовать предложение EXISTS
, которое обычно приводит к лучшей производительности. I.E .:
select * from yourTable yt
where exists (
select * from yourTempTable ytt
where yt.id = ytt.id
)
Я не знаю вашего запроса или данных, но это даст вам представление о том, как это сделать. Обратите внимание, что внутренний select *
работает так же быстро, как select aSingleField
, поскольку движок базы данных оптимизирует его.
Это все мои мысли. Но помните, чтобы быть на 100% уверенным в том, что лучше всего подходит для вашей проблемы, нет ничего похожего на выполнение обоих тестов и выбор времени на них :) Надеюсь, эта помощь.
Спасибо за помощь Мосты. Я должен определенно попробовать это. –
Добро пожаловать @Ebbu! –