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 によって判定されたレコードの数を示す。少ない方がイイ。
TrackBack URL :
Comments (0)
コメントはまだありません»
コメントはまだありません。
この投稿へのコメントの RSS フィード。TrackBack URL
コメントする