システムの実行速度が遅い原因としてMySQLやPostgreSQLなどのデータベースがボトルネックとなる場合があります。
データベースのボトルネックの解消方法としてインデックスを適切に設定しチューニングを行う方法があります。
インデックスは闇雲に設定しても正しく使用されず、設定しすぎるとINSERTやUPDATEで負荷がかかり処理が遅くなる可能性があります。
そこでEXPLAINの出番となります。
EXPLAINはインデックスが適切に使用されているかの実行計画を把握する事ができます。
実行計画とはテーブルがフルスキャンでデータ取得しているか、インデックスを使用して特定範囲をスキャンしてデータ取得しているかの結果です。
結果にはステータスが記述され、このステータスからどのように実行されているか把握する事ができます。
MySQLのEXPLAINのステータスになります。
例えばtypeにALLやindexが記述されていたらインデックスが正しく使用されてないので遅いので改善が必要で、constだとPRIMARY KEYまたはUNIQUEが使用されているので最速と判断できます。
使用する方法は対象のSELECT文の先頭にEXPLAINを付けるだけです。
例えば「test」というテーブルがあり「SELECT * FROM test」の実行計画を見る場合は「EXPLAIN SELECT * FROM test」と実行します。
実行すると下記のように表示されます。
> EXPLAIN SELECT * FROM test;
+------+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | test | ALL | NULL | NULL | NULL | NULL | 1 | |
+------+-------------+-------+------+---------------+------+---------+------+------+-------+
ちなみにPRIMARY KEYで検索したSELECT文で実行すると下記のようになります。
> EXPLAIN SELECT * FROM test WHERE id = 1;
+------+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables |
+------+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
データベースのボトルネックを調査する時はスロークエリを見て遅いSELECT文を抽出すると思います。
抽出したSELECT文にEXPLAINで実行して遅い原因を特定してチューニングすると速度が向上します。