2012年03月10日
cakePHPのmodelでFORCE INDEXを使用する方法
なんかうまくINDEXが使用されない箇所があって、たまにFORCE INDEXが使いたくなる事ってあると思います。
cakePHPだと、FORCE INDEXを書く方法が無いように見えますが、意外と簡単にFORCE INDEXを書く事ができます。
基本的にテーブル名の後ろに文字列入れられればいいので、実はjoinsに記載していまうのがいいんです。
最初はAppModelいじったり、DataSorce拡張しようとか考えましたが、ここはシンプルな方法で行くのが良いのでjoinsで書く事にしました。
書き方
<?php
$this->Hoge->find('all',array(
'conditions' => array(
'id' => array(1,2,3,4)
),
'fields' => array(
'id','name'
),
'joins' => array('FORCE INDEX(PRIMARY)'),
));
生成されたクエリみてみると普通に実行されていました。
SELECT `Hoge`.`id`, `Hoge`.`name` FROM hoges AS Hoge FORCE INDEX(PRIMARY) WHERE `Hoge`.`id` IN ( 1,2,3,4 );
ちなみにUSE INDEXもjoinsキーのなかで書く事ができます。(って言わなくてもわかるか…w
まあEXPLAIN使って調査して、使われるはずなのにINDEX使われなかったりしたら、FORCEかUSEをjoinsの部分に書いてあげれば問題ないとおもいます。