SQLチューニングのクエリチューニング
クエリチューニングについて
つい最近MySQLを学び、少しずつデータベースの挿入・更新・取得のクエリが書けるようになってきた初学者です。
そんな状況の次に見えてきた、クエリの書き方で処理速度が変わるという目を背けられなさそうな課題ワード、SQLチューニング。しかし調べればきりがなく出てくる出てくる。そんな状態なので初学者にとってこれは取り入れやすいというものをまとめていきます。
処理速度改善の優位性よりもしっかりと、取り入れられることに優位性をもたせた内容です。
いっぱいあってなにも取り入れられないよりも、厳選してでも必ず取り入れられるものをしっかり意識した方がまだいいのではないかという考えです。
ということでSQLチューニングでもまずはすぐに実践できるクエリチューニングについてまとめようと今回の記事を作成します。
SELECT * を乱用しない
テーブル内の特定のカラムのみが必要なのであれば、必要なカラムのみを取得する。
必要のないデータを取得すれば、単純に無駄な処理が発生する。
便利だからって甘えない!
WHERE句でカラムの演算を利用しない
SELECT句でカラムに対して演算や関数を利用することは多々あると思います。
しかしWHERE句でインデックスが貼られているカラムに対して利用すると、インデックスをオプティマイザが判断できなくなってしまうためのようです。
SELECT * FROM テーブル WHERE カラム名 = '大文字';
こういうときにもワイルドカードは便利w
SELECT * FROM テーブル WHERE UPPER(カラム名) = '小文字列など';
SQLの予約語を大文字・小文字を統一して記述する?
色々と調べるなかでこの情報が出てきたのですが、実際に処理速度が変わる時と変わらないときがあるのでクエリチューニングと言えるのか...。
しかしSQLスタイルガイドにも記述されている。そして統一した方がクエリも読み書きしやすいのでコード記述速度が改善するため取り入れたいため採用!
テーブル名にエイリアスをつけると処理速度が早くなる?
こちらも昔のSQLのバージョンでは効果があったようです。またケースによっては、多少処理速度が改善するようでした。
私はエイリアスを利用すると、JOIN句を利用したときに読み書きしやすいと感じるため採用しました。
JOINを利用しているときには、テーブルのカラムがわかりやすくなる便利!と感じました。
一応、
SELECT FROM テーブル名 AS テーブル略称;
サブクエリをなるべく使わない
こちらを利用すると仮テーブルとやらが作成されるため、データ量が増加することから処理が重くなるようです。
なので対応可能であれば、JOINを利用する。
こうなったときに、記述のストレスを少しでも軽減できるエイリアスの力をお借りします!
インデックスをしっかりと活用する
こちらも結構色々なパターンが存在したので、即採用できそうなことから
- インデックスカラムに対してSQL関数を利用すると、インデックスが効かない
CAST(), SUM(), FORMAT(), SUBSTR(), UPPER() ... など
- WHERE句の左辺側で算術演算子を使わない
WHERE インデックスカラム > カラム ー 1000 ;
WHERE インデックスカラム + 1000 < カラム ;
現状は、上記のクエリチューニングをしっかりと身につけて、クエリと仲良しになれた際にはもっと追加していこうと思います!!