2021.07.26
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
こんにちは!
今回はSQLチューニングについて書いていこうと思います!(以下、MySQL想定で進めていきます)
SQL(特にSELECT文)が遅い場合、直接的な要因の一つに、フェッチする件数が膨大になってしまうことが挙げられると思います。
これを解消するためのアプローチとして大きく分けて2つ存在します。
1.テーブルに適切なインデックスを設定する
テーブルのカラムにインデックス(索引)を設定し、検索の効率化と高速化を図ります。
基本的には絞り込みで使用するWHERE句のカラムに設定することが多いです。
2.SQLを組み替える
テーブルの結合順を変更したり、サブクエリをJOINに変えてみたり…etc
SQL自体を組み替えて検索の高速化を図ります。
ではどのようにこれらを適用していけばいいか。。
その助けになるのが「実行計画」です。
実行計画とは最適なデータ取得処理を行うために生成された情報です。
最適な方法はDBのオプティマイザ機能によって判断されます。
実行計画を見る方法は、SQL文の先頭に「EXPLAIN」をつけて実行することです。
例:EXPLAIN SELECT …
実際に実行すると画像のような項目を確認できます。
実行計画を見て特に重要なカラム(赤字)で避けなければいけない値を説明します。
- type
- ALL: フルテーブルスキャン。インデックスがまったく利用されていないことを示す。
- index: フルインデックススキャン。インデックス全体をスキャンする必要があるのでとても遅い。
- Extra
- Using temporary,Using filesort(2種複合): 全てのテーブルをJOINしてからFilesortをするパターン
このようにボトルネックとなる部分を実行計画を参照しながら見つけていき、インデックスの設定やSQLの組み換えで解消していきます。
ここまで書いてきましたが、SQLチューニングにおいて最も重要だと思うことを最後に書きます。
それは
チューニング前後で取得結果が変わらないこと
です。
特にSQLの組み換えを行っていると起こりがちなので、この前提は忘れないようにしましょう。
チューニング後にEXPLAINを外して実行し、取得結果に変動がないことを確認してください。
SQLのチューニングは奥が深く沼になることもありますが、遅いSQLが早くなったときの達成感はすごいです。
ステップアップとして、DBのチューニングについても学んでいかなければいけませんね。
それではまた!