如何在 Rails 中加速 find_or_initialize?

How to speed up find_or_initialize in Rails?

在我的 Rails 3.2.x 应用程序中有一个名为 Pdata 的 table 目前有超过 150 万条记录 (mysql),并且它每天都在增长。此table正在收集测量结果并不断更新。每个新的测量要么是一个新的 Pdata 记录,要么更新一个现有的记录。所以我

pdata = Pdata.find_or_initialize_by_a_id_and_b_id_and_timestamp(a_id,b_id,timestamp)

其中 a 和 b 基本上是不同的模型,每条记录属于它们,它们由测量数据提供。每天大约有 500 个测量值需要以这种方式更新或新建。 现在我发现 每个 find_or_initialize_by 调用大约需要 0.7 秒! 有谁知道更快的查找或初始化方法吗?有谁知道为什么这个电话需要这么长时间?

谢谢,安德烈亚斯

对于这种情况,使用您正在处理的列在 table 上创建一个索引,但请记住顺序很重要,首先使用能够最快缩小记录数量的列。

创建迁移并使用您的字段添加索引:

def change
  add_index :p_datas, [:a_id, :b_id, :timestamp]
end

根据前面提到的规则更改列的顺序。