ON子句中的列是否需要索引?

时间:2011-06-26 01:18:29

标签: sql sql-server database-design postgresql query-optimization

我是否必须在Joins中引用的列上创建索引? E.g。

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 个答案:

答案 0 :(得分:2)

通常在左侧,您将拥有一个主键,因此不需要索引。但是在右边你通常会有一个外键 - 索引是有意义的。

答案 1 :(得分:2)

这取决于您的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上的索引会被使用。