Производительность IN Criteria для операции обновления в MySQL - PullRequest
0 голосов
/ 09 февраля 2012

Я прочитал, что создание временной таблицы лучше всего, если количество параметров, переданных в критериях IN, велико.Это для избранных запросов.Это относится и к запросам на обновление?У меня есть запрос на обновление, который использует 3 объединения таблиц (внутренние объединения) и передает 1000 параметров в критериях IN, и этот запрос выполняется в цикле 200 или более раз.Каков наилучший подход для выполнения этого запроса?

1 Ответ

1 голос
/ 09 февраля 2012

IN операции обычно медленные.Передача 1000 параметров на любой запрос звучит ужасно.Если вы можете избежать этого, сделайте это.Теперь я действительно хотел бы попробовать временную таблицу.Вы даже можете поиграть с индексированием таблицы.Я имею в виду, вместо того, чтобы просто вводить значения, играйте с индексами, которые помогут вам оптимизировать ваши поиски.

С другой стороны, добавление с индексами медленнее, чем без индекса.Пройди там эмпирическое испытание.Теперь, что я считаю обязательным, имейте в виду, что при использовании другой таблицы вам не нужно использовать предложение IN, поскольку вы можете использовать предложение EXISTS, что обычно приводит к повышению производительности.IE:

select * from yourTable yt
where exists (
    select * from yourTempTable ytt
    where yt.id = ytt.id
)

Я не знаю ни вашего запроса, ни данных, но это дало бы вам представление о том, как это сделать.Обратите внимание, что внутренний select * так же быстр, как select aSingleField, так как ядро ​​базы данных оптимизирует его.

Это все мои мысли.Но помните, чтобы быть на 100% уверенным в том, что лучше для вашей проблемы, нет ничего лучше, чем выполнять оба теста и рассчитывать их время :) Надеюсь, это поможет.

...