- 2008-09-24 (水) 6:36
- 技術
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
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のブログ