Rails 5.1 - 我应该在primary_key和foreign_key上创建数据库索引吗?

时间:2017-11-22 20:10:29

标签: ruby-on-rails indexing database-design foreign-keys

以下是创建表格的迁移:

class CreateTemplates < ActiveRecord::Migration[5.1]
  def change
    create_table :templates, id: :uuid do |t|
      t.references :account, type: :uuid, foreign_key: true
      t.string :name
      t.text :info
      t.string :title

      t.timestamps
    end
  end
end

由于account_id是foreign_key(并标识客户),它将出现在此表的几乎所有(99%)查询中 - 检索属于另一个客户的模板没有多大意义。

那么我应该删除为account_id foreign_key创建的上述迁移的索引并创建这个吗?

add_index :templates, [:id, :account_id], unique: false

或者我应该保留原文并添加此内容吗?

修改

澄清99%的用例 - 我想我错了。创建模板时,始终插入account_id,以便tempaltes_controller的索引方法始终使用account_id返回所有模板,以便用户只能看到属于其帐户的模板列表。对于编辑,更新,删除,这些操作只需要template_id。所以我99%的猜测是错误的!在我看来,大多数查询实际上并不需要复合键。

1 个答案:

答案 0 :(得分:2)

如果您的大部分查询都要根据 [:id,:account_id] (这种情况不太可能)的组合进行过滤,那么创建综合索引可以提高查询的效果。

然而,听起来大多数查询只需要:account_id ,如果是这种情况,则无需添加复合索引。