如何在Rails中加快find_or_initialize?

时间:2018-08-07 08:23:26

标签: mysql ruby-on-rails indexing database-performance

在我的Rails 3.2.x应用程序中,有一个名为Pdata的表,当前有150万条记录(mysql),并且每天都在增长。该表正在收集测量结果并不断更新。每个新的度量要么是新的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秒!有人知道更快的查找或初始化方法吗?有谁知道为什么这个电话要花这么长时间?

谢谢安德里亚斯

1 个答案:

答案 0 :(得分:1)

在这种情况下,请使用您要处理的列在表上创建索引,但要记住顺序很重要,请首先使用该列,该列将以最快的速度缩小记录数。

创建迁移并在字段中添加索引:

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

请牢记前面提到的规则,更改列的顺序。