Sql ON子句中的列是否需要索引?
是否必须为联接中引用的列创建索引? 例如 我应该在左表(foo)、右表(bar)或两者上创建索引吗 当我使用EXPLAIN(Postgresql)和EXPLAIN(Postgresql)时,我注意到了不同的结果,使用EXPLAIN(Postgresql)和EXPLAIN(Postgresql)时有索引和没有索引,并切换比较顺序Sql ON子句中的列是否需要索引?,sql,sql-server,database-design,postgresql,query-optimization,Sql,Sql Server,Database Design,Postgresql,Query Optimization,是否必须为联接中引用的列创建索引? 例如 我应该在左表(foo)、右表(bar)或两者上创建索引吗 当我使用EXPLAIN(Postgresql)和EXPLAIN(Postgresql)时,我注意到了不同的结果,使用EXPLAIN(Postgresql)和EXPLAIN(Postgresql)时有索引和没有索引,并切换比较顺序 (right_table.bar = left_table.foo) 我知道WHERE子句的左侧使用了索引,但我想知道是否需要对ON子句中列出的列使用索引。通常在左侧有
(right_table.bar = left_table.foo)
我知道WHERE子句的左侧使用了索引,但我想知道是否需要对ON子句中列出的列使用索引。通常在左侧有一个主键,因此不需要索引。但是在右边你通常会有一个外键,这对索引是有意义的。这取决于你的
位置,但简单的回答是是
通常,左表将此列作为主键,默认情况下,这是一个索引。
第二列将是外键,您的查询可能会受益于为此列添加的索引。您需要分析查询以确定是否需要索引
假设查询是这样的:
SELECT *
FROM left_table
INNER JOIN right_table ON
left_table.foo = right_table.bar
WHERE left_table.SomeField = 1
在右侧的\u表上建立索引。一定会使用条形图
另一方面:
SELECT *
FROM left_table
INNER JOIN right_table ON
left_table.foo = right_table.bar
WHERE right_table.SomeField = 1
在这种情况下,将不使用right\u table.bar上的索引,而使用left\u table.foo上的索引。谢谢。。不接受你的回答我感到很难过,但上面的回答者写了很多。我对他的努力给予了奖励:)合并-连接算法通常会运行得更快,索引位于条件的两侧。对于大型基数联接,这可能是最快的策略。如果没有第二个索引,优化器甚至可能不会选择合并连接策略。
SELECT *
FROM left_table
INNER JOIN right_table ON
left_table.foo = right_table.bar
WHERE right_table.SomeField = 1