Во-первых, в самом простом аспекте вы ищете
select
mt.*
from
Master_Table mt
where
mt.indexed_col = 'value'
Это, вероятно, мгновенно, если у вас есть индекс на вашей главной таблице на указанном indexed_col в первой позиции (в случае, если у вас былсоставной индекс многих полей)…
Теперь, если я правильно понимаю вас в ваших разных столбцах поиска (всего 21), вы только что упростили их для избыточности в этом посте, но на самом деле делаете что-то в результатеиз
select
mt.*,
lt1.lookupDescription1,
lt2.lookupDescription2,
...
lt21.lookupDescription21
from
Master_Table mt
JOIN Lookup_Table1 lt1
on mt.lookup_col1 = lt1.pk_col1
JOIN Lookup_Table2 lt2
on mt.lookup_col2 = lt2.pk_col2
...
JOIN Lookup_Table21 lt21
on mt.lookup_col21 = lt21.pk_col21
where
mt.indexed_col = 'value'
У меня был проект, который более десяти лет назад имел дело с аналогичной ситуацией ... В мастер-таблице было около 21+ миллионов записей, и мне нужно было объединить около 30+ справочных таблиц.Система сканировала и запрашивала, умерла после выполнения запроса более чем через 24 часа.
Это также было на сервере MySQL, и исправлением было одно ключевое слово MySQL ...
Select STRAIGHT_JOIN mt.*, ...
Имея свою основную таблицу в первичной позиции, где предложение и его критерии непосредственно в главной таблице, вы хороши.Вы знаете отношения таблиц.Сделайте запрос в том порядке, в котором я его вам представил.Не пытайтесь думать об этом и пытайтесь оптимизировать на основе вспомогательной таблицы, которая может иметь меньшее количество записей, и каким-то образом думать, что это поможет быстрее выполнить запрос ... это не поможет.
ПопробуйтеКлючевое слово STRAIGHT_JOINОн взял запрос, над которым я работал, и завершил его примерно за 1,5 часа ... он возвращал все 21 миллион строк со всеми соответствующими описаниями ключей поиска для окончательного вывода, следовательно, все еще требовалось больше времени, чем всего 3 записи.