Извините, если это слишком просто, но заранее спасибо за помощь. Это для MySQL, но может быть актуально для других RDMBS
tblA имеет 4 столбца: colA, colB, colC, mydata, A_id
Он содержит около 10 ^ 9 записей, с 10 ^ 3 различными значениями для colA, colB, colC.
tblB имеет 3 столбца: colA, colB, B_id
В нем около 10 ^ 4 записей.
Мне нужны все записи из tblA (кроме A_id), которые имеют совпадение в tblB. Другими словами, я хочу использовать tblB для описания подмножества, которое я хочу извлечь, а затем извлечь эти записи из tblA. А именно:
SELECT a.colA, a.colB, a.colC, a.mydata
FROM tblA as a
INNER JOIN tblB as b
ON
a.colA=b.colA
a.colB=b.colB
;
Это займет очень много времени (более часа) на новом компьютере (4 ГБ, Core2Quad, Ubuntu), и я просто хочу проверить мое понимание следующих шагов оптимизации.
** Предположим, это единственный запрос, который я когда-либо выполню для этих таблиц. Поэтому игнорируйте необходимость выполнения других запросов.
Теперь мои вопросы:
Какие индексы я должен создать, чтобы оптимизировать этот запрос?
Я думаю, что мне просто нужно несколько индексов (colA, colB) для обеих таблиц.
Я не думаю, что мне нужны отдельные индексы для colA и colB.
В другой статье о переполнении стека (которую я не могу найти) упоминалось, что при добавлении новых индексов медленнее, когда существуют существующие индексы, поэтому это может быть причиной для использования множественного индекса.
Правильно ли ВНУТРЕННЕЕ СОЕДИНЕНИЕ? Я просто хочу результаты, где найдено совпадение.
Это быстрее, если я присоединяюсь (от tblA до tblB) или наоборот (от tblB до tblA)?
Этот предыдущий ответ говорит о том, что оптимизатор должен позаботиться об этом.
Имеет ли значение порядок детали после включения?
Это предыдущий ответ говорит о том, что оптимизатор также заботится о порядке выполнения.