cakephpで遅いmysqlテーブルをINDEXをつけて最適化しよう

2014年7月11日更新 view: 283 view
photoBy: http://binarywasteland.com/wp-content/uploads/201…

mysql の最適化したことありますか?

100レコード程度だと余裕です。
ただ、100万レコードとか莫大なレコードになるとまともに検索することができません。

極論、cakephpのpaginateのcountだけでも2秒3秒とかかることがあります。

最適化するとどうなるの?

早くなる!1000倍とか2000倍とか。場合によってはそれ以上。

早速やってみよう!

まずはページ下部に表示されるクエリを確認

Error Affected Num. rows Took (ms)
0                         0                100

つまり、0.1秒かかっているということです。

phpmyadminを起動

SQLのクエリにコピペしよう

Explainで確認をクリック

すると

ここでチェック!

上記の

type

結合型

INDEX

インデックスに対するALLのため、遅い。

ALL

フルテーブルスキャン
インデックスの追加等で回避可能。

INDEX か ALL なら改善すべき

key

MYSQLが使用したインデックス

rows

検索されるレコード数 (少ないほど良い)

Extra

UsingFilesort

Orderbyにインデックスを使用できない

UsingTemporary

クエリの解決にtemporaryテーブルが必要。

  • Distinct使用時
  • ORDERBYにインデックスを使用できない
  • ORDERBYGROUPと式が異なる場合

上記のビックリマーク内の文字が表示されていたら改善すべき。

インデックスを追加しよう

phpmyadminの構造タブをクリックして、インデックスをクリック。

で必要に応じて以下のように入力。

これでインデックスを貼ることができます。

参考

http://www.slideshare.net/infinite_loop/mysql-indexexplain

時にはforce indexを使おう

設定してもインデックスが効かない場合がある。
そんな時は、こう!

<?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 );

絶対にindex使えよって命令。

スポンサードリンク

関連記事

関連カテゴリ