Ruby on Rails は初めてです。現在、Rails アプリケーションのパフォーマンスの問題に取り組んでいます。コードのボトルネックを見つけるために New Relic rpm を使用しています。そうこうしているうちに、わからないことを発見。問題は、ここの Rails アプリケーションで、モデル B が次のように A の主キーと C の主キーの 2 つのプロパティを持つ、2 つのモデル A、B、および C を使用したことです。
class B
include DataMapper::Resource
belongs_to :A, :key=>true
belongs_to :C, :key=>true
end
Aのモデルは次のとおりです。
class A
include DataMapper::Resource
property :prop1
...
has n, :bs
has n, :cs, :through => :bs
end
次のステートメント a.find(:c.id=>10) を発行すると、内部的に次の SQL クエリが実行されます。
select a.prop1, a.prop2,... from a INNER JOIN b on a.id = b.a_id INNER JOIN c on b.c_id = c.id where (c.id=10) GROUP BY a.prop1, a.prop2,....[here in group by all the properties that has been mentioned in select appears, I don't know why]
そして、このステートメントは、Web トランザクション中に時間がかかりすぎます。興味深いことに、端末の mysql プロンプトで同じ自動生成クエリを実行すると、時間が非常に短くなります。group by 句で非常に多くのフィールドに言及しているためだと思います。クエリがどのように形成されているのか理解できません。誰かがこれを理解し、これを最適化するのを手伝ってくれたら、本当に感謝しています。ありがとうございました。