CakePHPのアソシエーションでInner Joinを利用してレスポンス速度を向上

2008.12.15 / php

レコードサイズが大きくなってくるとhasOneやbelongsToのアソシエーションでかなり時間を食うときがあります。特に大きな処理をしなくても、ページアクセス時にControllerでdescribe <Table>して、結合した結果を舐めて時間が食われます。

いくらなんでも時間かかりすぎだろ、、と思ってよく調べてみたらCakeでのテーブル間JoinてLeft Joinになってるんですね。クエリ凝視するまで気づかなかった。これ、特に問題なければ内部結合(Inner Join)にするだけでレスポンス速度は大きく変わります。方法はModelでアソシエーション対象Model名のtypeを"INNER"にするだけ。

  <?php
  class User extends AppModel {
          var $name = 'User';
          
          var $hasOne = array(
                  'Profile' => array(
                          'className' => 'Profile',
                          'foreignKey' => 'user_id',
                          'conditions' => '',
                          'type' => ' INNER'
                  )
          );
  }
  ?>
  

こういうテクはもちろんケースバイケースですけど、意外に盲点なチューニング方法かもしれません。