CakePHP Paginateが遅い
CakePHP 1.3.6
CakePHPの難点は、動作が遅いことです。機能が豊富な分、仕方ないかもしれませんが。
調べてみると、Paginateの処理でも若干時間がかかっているようなので、これをカスタムして早くする方法です。
デフォルトのまま利用すると、まず件数を取得するために、Paginateは関連するテーブルのすべてのデータを取ってきて、カウントします。
しかし、アプリの作りから、これが不要な場合もありますよね。
そういう場合は、モデルに次のように書き込みましょう。
//Studentモデルのファイル student.php
function paginateCount($conditions = null, $recursive = 0, $extra = array()) { $sql="SELECT DISTINCT student_id FROM students"; $results=$this->query($sql); $number=count($results); return $number; }
returnで戻す値が整数になるように気をつけましょう。
すると、全件の件数はこれで数えるようになるので、少しだけ速度が速くなります。
私の場合は、10万件のデータを関連テーブルなど含めてカウントしていたので164msかかっていたのが、14msに縮められました。
CakePHP公式マニュアル 4.9.4 カスタムしたクエリによるページ付け
下記には、recursiveを-1に設定することで、早くしようという例も載っています。
http://cakephp.1045679.n5.nabble.com/pagination-SELECT-COUNT-query-slow-td3321847.html