Мой вопрос длинный, но простой.У меня есть запросы следующего вида:
select obj from table where condition1 and obj in (
select obj from table where condition2 and obj in (
select obj from table where condition3 and obj in (
...
)))
Этот запрос занимает очень много времени.Я боюсь, что MySQL выполняет этот запрос следующим образом (для простоты давайте рассмотрим только один подзапрос):
select obj from table1 where condition1 and obj in (select obj from table2 where condition2)
MySQL проходит по строкам таблицы 1. Если condition1
выполняетсязапускает цикл над объектом из набора, полученного подзапросом.Если есть рассматриваемый объект, он добавляется в «окончательный» список объектов.
Моя проблема в том, что в приведенном выше примере цикл зациклен.И если у меня есть два подзапроса, у меня есть цикл в цикле в цикле.Если в каждом цикле около 10 000 циклов, у меня случается катастрофа.
Мое решение - найти n наборов (каждый набор соответствует одному select
).Затем я создаю цикл для каждого набора независимо (поэтому у меня нет циклов в циклах).Примерно так.
dictionary = []
for (elem in set1) {
dictionary[elem] += 1
}
for (elem in set2) {
dictionary[elem] += 1
}
for (elem in set3) {
dictionary[elem] += 1
}
Затем я делаю еще один цикл над всеми элементами dictionary
и выбираю только те ключи, которые были найдены во всех наборах:
finalSet = []
for (elem in dictionary) {
if (dictionary[elem]==numberOfSets) {
finalSet.add(elem)
}
}
Итак,Мой вопрос заключается в том, что MySQL оптимизирован так, как я хочу, чтобы он был оптимизирован (описанный выше способ).Или он создает циклы в циклах в циклах ....
ДОБАВЛЕНО
Я просто подумал, что, возможно, я смогу добиться желаемой оптимизации путем переформулировки своего запроса.Вместо:
select obj from table where condition1 and obj in (
select obj from table where condition2 and obj in (
select obj from table where condition3 and obj in (
...
)))
Я должен написать:
select obj from table where condition1
and obj in (select obj from table where condition2)
and obj in (select obj from table where condition3)
...