以下是创建表格的迁移:
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%的猜测是错误的!在我看来,大多数查询实际上并不需要复合键。
答案 0 :(得分:2)
如果您的大部分查询都要根据 [:id,:account_id] (这种情况不太可能)的组合进行过滤,那么创建综合索引可以提高查询的效果。
然而,听起来大多数查询只需要:account_id ,如果是这种情况,则无需添加复合索引。