CakePHP リレーションを外す
CakePHPがとても遅くなる場合があります。
CakePHPのよいところは、データベースのリレーションをモデルに定義しておけば、後は関係するデータをうまいこと取得してくれるところです。
しかし、これが仇をなしてひとつひとつの動作が遅くなってしまう場合があります。
たとえば、次のようなデータ構造があるとします。
//師匠(Master)が多数の弟子(Student)を持つ Masterモデル hasMany Studentモデル
この時、Masterのデータは10件程度だとしても、Studentのデータ数が10万件ぐらいあるとすると、毎回次のようなMySQLのクエリが発行されます。
//Masterのデータが1から16まである場合 SELECT `Student`.`id`, `Student`.`name`, `Student`.`skill_id`,Student`.`master_id`, `Student`.`contents`, `Student`.`age`, Student`.`comment`,`Student`.`created`, `Student`.`modified` FROM `students` AS `Student` WHERE `Student`.`master_id` IN (1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16)
これだけで相当時間とメモリを食います。
新規でデータを追加する際やデータを編集する場合には、この処理は不要です。
しかし、表示のためにrecursiveを‐1にすることができません。
そういう場合、一時的にMaster hasMany Studentsのリレーションを外すことができます。
//動作が遅いので、Studentをバインドから外す //stutdents_controller.phpに記述 $this->Student->Master->unbindModel( array('hasMany' => array('Student')) );
hasAndBelongsToManyの場合は次の通りです。
//動作が遅いので、Studentをバインドから外す //stutdents_controller.phpに記述 $this->Student->Master->unbindModel( array('hasAndBelongsToMany' => array('Student')) );