Home > 技術 > CakePHPの高深度アソシエーションの欠点

CakePHPの高深度アソシエーションの欠点

CakePHP(1.1)でSNS的なシステムを運用していて気づいた事。
1.2で改善されてるのか?ちょっと調べてないから解らないが…

メッセージ一覧のページの表示が前々から遅くて、何が起きてるのかと思いつつ放置していたんだが
少し余裕が出て来たのでデバッグモード(=2)でクエリを見てみたら、何か件数x3くらいのクエリが実行されていた訳だ

ここで問題。

PHP標準のSQL発行ではアソシエーションの階層はハッシュの階層に反映されない。LEFT JOINを何度しようと、結局はSELECTで指定したカラム名による一次ハッシュになるはず。
でもCakeでアソシエーションを組むと、階層が反映されるわけだ。
どうやっているんでしょうね?

正解は、「カラムごとにクエリを何度も発行している」(!!)
だから今回の様に、何かのリストのような物を表示する時にCakeのfindAll(Byなんたらを含む)をするとめちゃくちゃ重いってわけだ

結局Model::query()にカスタムしたSQL文を突っ込んでやったら爆速になりましたとさ。

まとめ

CakePHPのfind系メソッドは複雑なアソシエーションを組んだデータのリストには向いてないので、自分でSQL文を書こう!

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://blog.s-satoshi.net/tech/cakephp%e3%81%ae%e9%ab%98%e6%b7%b1%e5%ba%a6%e3%82%a2%e3%82%bd%e3%82%b7%e3%82%a8%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e6%ac%a0%e7%82%b9/trackback/
Listed below are links to weblogs that reference
CakePHPの高深度アソシエーションの欠点 from S.Satoshiのブログ

Home > 技術 > CakePHPの高深度アソシエーションの欠点

Search
Feeds
Meta

Return to page top