Для извлечения большого подмножества таблицы из MySQL, как индексирование, порядок таблиц влияет на скорость запроса? - PullRequest
0 голосов
/ 15 марта 2010

Извините, если это слишком просто, но заранее спасибо за помощь. Это для 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), и я просто хочу проверить мое понимание следующих шагов оптимизации.

** Предположим, это единственный запрос, который я когда-либо выполню для этих таблиц. Поэтому игнорируйте необходимость выполнения других запросов.

Теперь мои вопросы:

  1. Какие индексы я должен создать, чтобы оптимизировать этот запрос? Я думаю, что мне просто нужно несколько индексов (colA, colB) для обеих таблиц. Я не думаю, что мне нужны отдельные индексы для colA и colB. В другой статье о переполнении стека (которую я не могу найти) упоминалось, что при добавлении новых индексов медленнее, когда существуют существующие индексы, поэтому это может быть причиной для использования множественного индекса.

  2. Правильно ли ВНУТРЕННЕЕ СОЕДИНЕНИЕ? Я просто хочу результаты, где найдено совпадение.

  3. Это быстрее, если я присоединяюсь (от tblA до tblB) или наоборот (от tblB до tblA)? Этот предыдущий ответ говорит о том, что оптимизатор должен позаботиться об этом.

  4. Имеет ли значение порядок детали после включения? Это предыдущий ответ говорит о том, что оптимизатор также заботится о порядке выполнения.

1 Ответ

1 голос
/ 15 марта 2010

1) Какие индексы я должен создать для оптимизации этого запроса?

Индексы могут помочь, даже если на столбцы ссылаются только в предложении SELECT. Таким образом, я мог бы создать индекс покрытия на TABLE_A со столбцами в следующем порядке:

  1. 1009 * КОЛ *
  2. colB
  3. colC
  4. MYDATA

Для TABLE_B:

  1. 1022 * КОЛ *
  2. colB

Порядок важен, потому что индексы обрабатываются слева направо, чтобы соответствовать критериям для индекса, который будет использоваться. IE: colC не будет запускать индекс без colA и colB в запросе, а colB не будет запускать использование индекса без ссылки на colA и т. Д. Но на colC нет необходимости ссылаться для запуска Индекс использовать либо.

2) Правильно ли ВНУТРЕННЕЕ СОЕДИНЕНИЕ? Я просто хочу результаты, где найдено совпадение.

Да, это правильно для ваших требований.

3) Это быстрее, если я присоединяюсь (от tblA до tblB) или наоборот (от tblB до tblA)?

Проверьте и сравните.

4) Имеет ли значение порядок детали после включения?

Нет, это не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...