@blog.justoneplanet.info

日々勉強

SQLの性能をテストする

以下のようにEXPLAINしてみるとイイ。

EXPLAIN SELECT *
    FROM  `parent`
    LEFT JOIN  `child`
    ON  `parent`.id =  `child`.id_parent
    WHERE  `parent`.id = 1

どうやらchildテーブルを全て検索してるようだ。

table type possible_keys key ref rows
parent const PRIMARY PRIMARY const 1
child ALL NULL NULL NULL 311

■改善

以下を実行してインデックスを付加し、クエリの性能を向上させる。

ALTER TABLE `child`
    ADD CONSTRAINT `fk_child_tbl_parent_tbl`
    FOREIGN KEY (`id_parent`) REFERENCES `parent` (`id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION;

劇的だ!ヾ(@⌒▽⌒@)ノchildテーブルを1行しか検索しなくなった。

table type possible_keys key ref rows
parent const PRIMARY PRIMARY const 1
child ref fk_child_tbl_parent_tbl fk_child_tbl_parent_tbl const 1

参考

type
結合型。
const。テーブルに、一致するレコードが最大で 1 つ。
ref。前のテーブルのレコードの組み合わせのそれぞれに対して、インデックス値にマッチするすべてのレコードがこのテーブルから読み取られる。ref は、『インデックスの左端の先頭部分のみが結合で使用される場合』、『インデックスが UNIQUE や PRIMARY KEY ではない場合』に使用される。
ALL。前のテーブルのレコードの組み合わせのそれぞれに対して、フルテーブルスキャンが実行される。
possible_keys
テーブル内のレコードの検索に MySQL で使用可能なインデックスを示す。
key
MySQL が実際に使用を決定したキー(インデックス)を示す。
ref
テーブルからレコードを選択する際に key とともに使用されるカラムまたは定数。
rows
クエリの実行に際して調べる必要があると MySQL によって判定されたレコードの数を示す。少ない方がイイ。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment