cakePHPのmodelでFORCE INDEXを使用する方法

Twitter ツイート Hatena Bookmark ブックマーク

なんかうまくINDEXが使用されない箇所があって、たまにFORCE INDEXが使いたくなる事ってあると思います。
cakePHPだと、FORCE INDEXを書く方法が無いように見えますが、意外と簡単にFORCE INDEXを書く事ができます。

基本的にテーブル名の後ろに文字列入れられればいいので、実はjoinsに記載していまうのがいいんです。
最初はAppModelいじったり、DataSorce拡張しようとか考えましたが、ここはシンプルな方法で行くのが良いのでjoinsで書く事にしました。

書き方

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$this->Hoge->find('all',array(
    'conditions' => array(
        'id' => array(1,2,3,4)
    ),
    'fields'  => array(
        'id','name'
    ),
    'joins' => array('FORCE INDEX(PRIMARY)'),
));

生成されたクエリみてみると普通に実行されていました。

1
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の部分に書いてあげれば問題ないとおもいます。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。