パフォーマンス改善のために、EXPLAINを使って、インデックスの貼り方を調査する時のメモ。
Railsを使っているので、その前提で書いている。
EXPLAINの手順
まずは Rails のログを見て、発行されているクエリを確認する。
Hoge Exists (0.7ms) SELECT 1 AS one FROM `hoges` WHERE `hoge`...
続いて、MySQLに接続する。データベースを選択したら、上記のクエリに EXPLAIN をつけて実行。
mysql> EXPLAIN SELECT 1 AS one FROM `hoges` WHERE `hoge`...;
+----+-------------+-------------+------+-----------------------------------------------------------------------------------------------+---------------------------+---------+-------+------+------------------------------------+
| id | select_type | table | type | possible_key | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------+-----------------------------------------------------------------------------------------------+---------------------------+---------+-------+------+------------------------------------+
| 1 | SIMPLE | hoges | ref | index_hoges_on_fuga | index_hoges_on_fuga | 1023 | const | 1 | Using index condition; Using where |
+----+-------------+-------------+------+-----------------------------------------------------------------------------------------------+---------------------------+---------+-------+------+------------------------------------+
1 row in set (0.00 sec)
このようにして、クエリの実行計画を確認していき、より良い結果になる貼り方を選ぶ。
複数の候補があれば、インデックスを貼らなかった場合、貼った場合(案1)、貼った場合(案2)と検証していけば良い。
EXPLAINの見方
特に確認しておきたいのは、key、key_len、rows、Extraあたり。
key
possible_key(候補として挙げられたkey)の中から選ばれたkey。
key_len
キーの長さ。短い方が高速になる。
rows
おおよその行数の見積もり。
Extra
Using index となっていれば、クエリがインデックスを用いて解決できたことを示しており、インデックスによる高速化を図りたい場合は目安になる。
ちなみに、上記の表では Using index condition となっているが、この場合はクエリがインデックスの値を一部利用できることを示している。