2014-09-02 77 views
0

我見過幾次Rails中以下遷移:欄上的數據庫索引順序使用Rails遷移

create_join_table :customers, :products do |t| 
    # t.index [:customer_id, :product_id] 
    # t.index [:product_id, :customer_id] 
end 

我不明白爲什麼我們需要兩次聲明相同的指數,或順序索引中的列具有重要優先權?它會增加查詢速度嗎?提前致謝。

回答

0

我認爲解釋索引的最好方法是使用電話本的例子。電話簿由Last Name,First Name組織。你可以很容易地看到某人的姓氏或他們的姓氏和名字,但是你不能輕易地通過他們的名字來查看某人。要通過名字輕鬆搜索,只需要一個單獨的索引。

因此,回到您的示例中,他們有一個關於customer_id和product_id的索引,因此您可以輕鬆找到customer_id或customer_id和product_id。但僅靠第一個索引不允許您通過product_id輕鬆搜索。所以第二個索引允許您輕鬆找到product_id或product_id和customer_id。

如果您有has_many :through relationship,那麼您的連接表應該對連接中涉及的兩個屬性都有一個唯一索引,作爲您提供的組合鍵。

這個問題的答案是關於何時在軌使用索引一些更多的信息相當不錯的資源:When to add what indexes in a table in Rails

+0

所以,如果我用這個指標2,我並不需要創建的product_id和CUSTOMER_ID指標因爲它已經完成了2列索引? – malcoauri 2014-09-02 12:46:34

+0

而且,當我需要通過product_id和customer_id獲取記錄時,我可以更快地使用我的示例或第二個索引中的第一個索引。爲什麼我需要它們兩個? – malcoauri 2014-09-02 12:47:57

+0

您不需要爲product_id創建一個單獨的索引,因爲第二個索引已經將其編入索引。兩者都提供了速度選項。通過在customer_id之前查找product_id並反之亦然,某些查詢可能會運行得更快。使用多鍵索引時,您希望首先減少記錄數量纔是唯一的值。所以它真的取決於你正在運行的查詢和你的數據。 – ChrisBarthol 2014-09-02 14:47:47