公開日:2021.07.26

SQLチューニング

テクログdb

こんにちは!

今回は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のチューニングについても学んでいかなければいけませんね。

それではまた!

この記事を書いた人

棒人間

入社年2019年

出身地東京都

業務内容開発

特技または趣味スケボー

棒人間の記事一覧へ

テクログに関する記事一覧