【问题标题】:Is an index required for columns in ON clause?ON 子句中的列是否需要索引?
【发布时间】:2011-09-22 19:37:52
【问题描述】:

我必须在联接中引用的列上创建索引吗? 例如

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 子句中列出的列的索引。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 合并连接算法通常运行得更快,索引在 ON 条件的两边。对于大基数连接,这可能是最快的策略。如果没有第二个索引,优化器甚至可能不会选择合并连接策略。
    【解决方案2】:

    通常在左边你会有一个主键,所以那里不需要索引。但在右侧,您通常会有一个外键 - 对它进行索引可能是有意义的。

    【讨论】:

    • 谢谢.. 不接受你的回答我很难过,但上面的回答者写了很多。我奖励了他的努力:)
    猜你喜欢
    • 2012-03-22
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2017-12-19
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多