CakePHP(1.1)でSNS的なシステムを運用していて気づいた事。
1.2で改善されてるのか?ちょっと調べてないから解らないが…
メッセージ一覧のページの表示が前々から遅くて、何が起きてるのかと思いつつ放置していたんだが
少し余裕が出て来たのでデバッグモード(=2)でクエリを見てみたら、何か件数x3くらいのクエリが実行されていた訳だ
ここで問題。
PHP標準のSQL発行ではアソシエーションの階層はハッシュの階層に反映されない。LEFT JOINを何度しようと、結局はSELECTで指定したカラム名による一次ハッシュになるはず。
でもCakeでアソシエーションを組むと、階層が反映されるわけだ。
どうやっているんでしょうね?
正解は、「カラムごとにクエリを何度も発行している」(!!)
だから今回の様に、何かのリストのような物を表示する時にCakeのfindAll(Byなんたらを含む)をするとめちゃくちゃ重いってわけだ
結局Model::query()にカスタムしたSQL文を突っ込んでやったら爆速になりましたとさ。
まとめ
CakePHPのfind系メソッドは複雑なアソシエーションを組んだデータのリストには向いてないので、自分でSQL文を書こう!
0 件のコメント:
コメントを投稿