以下のように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 によって判定されたレコードの数を示す。少ない方がイイ。