Требуется ли индекс для столбцов в предложении ON? - PullRequest
3 голосов
/ 26 июня 2011

Нужно ли создавать индекс для столбцов, на которые есть ссылки в объединениях? Э.Г.

SELECT
  *
FROM
  left_table
INNER JOIN
  right_table
ON
  left_table.foo = right_table.bar
WHERE
  ...

Должен ли я создавать индексы для left_table (foo), right_table (bar) или для обоих?

Я заметил разные результаты, когда использовал EXPLAIN (Postgresql) с индексами и без них и переключался в порядке сравнения

(right_table.bar = left_table.foo)

Я точно знаю, что индексы используются слева от предложения WHERE, но мне интересно, нужны ли мне индексы для столбцов, перечисленных в предложениях ON.

Ответы [ 2 ]

2 голосов
/ 26 июня 2011

Это зависит от вашего условия where, но краткий ответ - yes.

Обычно в левой таблице этот столбец будет иметь первичный ключ, который по умолчанию является индексом.Второй столбец будет внешним ключом, и, вероятно, ваши запросы получат выгоду от индекса, добавленного для этого столбца.Вам нужно проанализировать ваш запрос, чтобы точно сказать, нужен ли вам индекс.

Допустим, запрос выглядит так:

SELECT  *
FROM  left_table
   INNER JOIN right_table ON
      left_table.foo = right_table.bar
WHERE left_table.SomeField = 1

Индекс на right_table.bar обязательно будет использован,

С другой стороны:

SELECT  *
FROM  left_table
   INNER JOIN right_table ON
      left_table.foo = right_table.bar
WHERE right_table.SomeField = 1

В этом случае индекс для right_table.bar не будет использоваться вообще, но индекс для left_table.foo будет использоваться.

2 голосов
/ 26 июня 2011

Обычно слева у вас будет первичный ключ, поэтому индекс там не нужен. Но справа у вас обычно есть внешний ключ, который может иметь смысл индексировать.

...