2014-09-02 60 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