我是否必须在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子句中列出的列的索引。
答案 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
上的索引会被使用。