次のようなAPIからデータを取得しています:
[{"type": "a", "value": 1, "identifier": 1},
{"type": "b", "value": 9, "identifier": 1},
{...},{...},
{"type": "a", "value": 2, "identifier": n}]
識別子は 1 ~ 500 の任意の値にすることができ、すべてのレコードが同じ識別子を持つことは保証されません。識別子が存在する場合、それはすべて同じ型と特定の範囲の値を持ちます。レコードを更新するために最初に使用していたものは次のようになりました。
api_data.each do |x|
temp = Object.find_or_create_by_type_and_identifier_and_id(x["type]", x["identifier"], user_id)
temp.update_attributes(x)
end
これは信じられないほど遅く、このデータがロードされるたびに約 2200 のクエリが実行されます。1100 エントリに対して、データが存在するかどうかを確認するために 1 回、次に更新するために 1 回。現在使用されているテーブル スキームは次のようになります。
create table ( type, identifier, id, value)
これはobviously inefficient
、私はどれだけ気づいていませんでした。新しいユーザー データを更新またはプルする必要があるときにアプリケーションがクロールしないように、クエリの数を減らすにはどうすればよいですか?
提案されている方法は、大量に挿入し、更新が必要なときに以前のエントリを削除することです。これにより、これが 2 に減少しますが、それが最善の方法であるかどうかはわかりません。