3

我是否必須爲連接中引用的列創建索引? 例如ON子句中的列需要索引嗎?

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

這取決於您的where條件,但簡要回答是yes

通常左表格會將此列作爲主鍵,這是默認情況下的索引。 第二列將是一個外鍵,並且很可能您的查詢將受益於爲此列添加的索引。您需要分析您的查詢以確定是否需要該索引。

咱們說的查詢是這樣的:在right_table.bar

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

指數肯定會被使用。

在另一邊:

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意志。

+0

合併連接算法通常在ON條件的兩側都會運行得更快。對於大型基數連接,這可能是最快的策略。如果沒有第二個索引,優化器甚至可能不會選擇合併連接策略。 –

2

通常在左邊你會有一個主鍵,所以沒有索引需要那裏。但是在右邊你通常會有一個外鍵 - 這對索引是有意義的。

+0

謝謝..我感覺不好,不接受你的回答,但上面的回答者寫了很多。我獎勵他的努力:) – newbie

+1

@newbie,你可以upvote很多答案=) –

+0

@Josh Smeaton,哦。不知道。謝謝。 – newbie

相關問題