Lifeプログラミングブログ運営ライフハックお金キャリアお問い合わせサイトマップHOMEプログラミングデータベースEXPLAINとインデックスを利用したスロークエリの高速化手順EXPLAINとインデックスを利用したスロークエリの高速化手順2021年6月2日データベースツイートシェアはてブ送るPocket前回、MySQLのEXPLAINの読み方とチューニング時のチェックポイントでEXPLAINの読み方について紹介しました。スロークエリを引き起こす最も多い原因のひとつが『正しくインデックスが作成・利用されていない』です。そこで今回はEXPLAINとインデックスを利用した具体的なチューニング手順について紹介します。MySQLは5.7.34を利用しています。key以外にインデックスは作成されていないとします。EXPLAINとインデックスを利用したチューニング手順EXPLAINでSQLの実行計画を取得するインデックスの確認と作成EXPLAINを再実行し、クエリが改善されたか確認する以下では各項目について紹介します。EXPLAINでSQLの実行計画を取得する先頭にEXPLAINを追記してSQLを実行すると実行計画が取得できます。SQLのチューニングをする際は、対象のSQLの先頭にEXPLAINを記述し、SQLを実行するところから始めます。今回のチューニング対象のSQLの実行計画は以下の通りです。SQLの末尾にある\Gは結果を縦出力にするオプションです。sec)typeに表示されているALLはテーブルのフルスキャンが実行されていることを意味します。typeにALLが表示されるクエリは改善が必要です。possible_keysやkeyがNULLであることから、クエリに関連したインデックスは作成されていないことがわかります。今回の場合ですと検索条件のageにインデックスを作成することでテーブルをフルスキャンせずに済みそうです。[テーブル名]で当該テーブルのインデックスを確認します。以下の結果からわかる通り、ageに対してはインデックスが作成されていません。テーブル名(カラム)で作成します。usersテーブルのageカラムにインデックスを作成する場合は以下のようになります。indexを実行すると新しくインデックスが追加されたことがわかります。sec)EXPLAINを再実行し、クエリが改善されたか確認するチューニング後、再びEXPLAINを実行します。EXPLAINの結果が改善されていればチューニングは完了です。sec)keyに先ほど作成したindex_users_on_ageが表示されているので、インデックスが利用されていることがわかります。インデックスが利用されるようになったため、typeもALLからref(ユニークではないインデックスによる等価検索)に変更されました。EXPLAINを実行する場合は実際のデータを利用する同じテーブルでもレコード数やデータの分散によって実行計画の結果が異なります。本番環境で数万件データが保存されているのであれば、クエリチューニングを行う際も同等のデータを用意しなければ意味がないので気を付けましょう。6のinsert_allで大量のダミーデータを短時間で作成するで紹介した方法で大量のダミーデータが作成できます。INDEX』で必要なインデックスを作成するEXPLAINを再実行し、クエリが改善されたことを確認するTwitter(@nishina555)やってます。フォローしてもらえるとうれしいです!RECOMMENDデータベースMySQLパフォーマンスチューニングツイートシェアはてブ送るPocketプロフィールnishina大企業、ベンチャーと色々なところでWebエンジニアやっています。退職手続きから案件参画まで。人気の記事iPhoneの連絡先の保存がうまくできない!?原因は同期設定かも。