【问题标题】:columns' order in database indexes using Rails migrations使用 Rails 迁移的数据库索引中的列顺序
【发布时间】:2014-10-26 16:10:21
【问题描述】:

我在 Rails 中见过几次以下迁移:

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

我不明白为什么我们需要两次声明同一个索引,或者索引中列的顺序有很大的优先级?它会提高查询速度吗?提前致谢。

【问题讨论】:

    标签: sql ruby-on-rails


    【解决方案1】:

    我认为解释索引的最佳方式是使用电话簿示例。电话簿按姓氏、名字组织。您可以通过姓氏或姓氏和名字轻松查找某人,但您不能仅通过他们的名字轻松查找某人。要仅按名字轻松搜索,您需要一个单独的索引。

    回到您的示例,他们在 customer_id 和 product_id 上有一个索引,因此您可以轻松找到 customer_id 或 customer_id 和 product_id。但仅第一个索引并不能让您轻松地通过 product_id 进行搜索。因此,第二个索引可以让您轻松找到 product_id 或 product_id 和 customer_id。

    如果您有has_many :through relationship,您的连接表应该在连接中涉及的两个属性上都有一个唯一索引,作为您提供的复合键。

    这个问题和答案是一个很好的资源,可以获取有关何时在 Rails 中使用索引的更多信息:When to add what indexes in a table in Rails

    【讨论】:

    • 那么,如果我使用这2个索引,我不需要为product_id和customer_id分别创建索引,因为它已经完成了2列的索引?
    • 而且,当我需要按 product_id 和 customer_id 获取记录时,我可以使用示例中的第一个索引或第二个索引更快地完成。为什么我都需要它?
    • 您不需要为 product_id 创建单独的索引,因为第二个索引已经在索引它。两者都提供了速度选项。通过在 customer_id 之前查找 product_id,某些查询可能会运行得更快,反之亦然。使用多键索引,您希望首先使用更唯一的值来减少记录数。因此,这实际上取决于您正在运行的查询和您的数据。
    猜你喜欢
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    相关资源
    最近更新 更多