我有一个经常使用的查询,其中User
模型has_many :payments
:
current_user.payments.where(status: "succeeded").order(id: :desc).page(params[:page]).per(params[:size])
我是否需要按:desc
顺序在主键上建立索引?
add_index :payments, [:user_id, :status], order: {id: :desc})
或者我可以省略顺序吗?
add_index :payments, [:user_id, :status]
编辑:
查询中的page()
和per()
来自kaminari gem。我需要额外的索引吗?
一些提示,也许是对你问题的回答:
我看到你在.where(status: "succeeded")
上查询,这是一个Enum吗?这也将使查询更有效。
还有,为什么要用id
订购呢?在我看来,通过created_at
付款似乎更合乎逻辑。
那么我想知道你是否用add_reference
定义了users
和payments
之间的关系。这将创建外键关系,这也更快。
最后,添加一个额外的索引总是是可能的,但它真的取决于很多事情,如果它要做的区别:
职业:
- 当数据搜索变大(不确定,像>100000行)时,查找记录将变得更快
反对:
- 插入和更新将变得稍微慢一些(每次插入都需要一个额外的索引表来更新)
我个人认为add_reference
在users
和payments
之间的默认索引可以满足非常非常长的时间。