SQLの書き方によるパフォーマンスチューニング
SQLを作成するうえで気を付けるべき基本的な事
ソート回避
物理メモリが使用されると劇的に遅い
- GROUP BY
- ORDER BY
- SUMやMAXなどの集計関数
- DISTINCT
- UNIONなどの集合演算子
- RANKなどのOLAP関数
インデックスを確実に使う
インデックスが使われない書き方
- 項目に計算している (amount * 1.1 > 1000など)
- IS NULL
※MySQL、PostgreSQLはNULLをインデックスに格納する - <>,NOT INなどの否定形
- OR文
- 復号インデックスと列指定条件順序が異なる
- 部分一致、後方一致
- 暗黙の型変換
また、インデックスは適切に作成する
- カーディナリティの高いカラム
- マルチカラムインデックスの検討する
- カバリングインデックスを使用する
中間テーブルを減らす
- サブクエリNG
- 集約より先に結合する
- Viewは使わない
メモリアクセスを減らす
- レコードの存在チェックでCOUNTを使わない
※LIMITやROWNUMを使用する
そもそも遅いのはなぜか
- 1つのSQLが遅い
- チューニングする
- 1回では遅くないSQLを複数回実行している
- 1回でまとめてとるなど、実行回数を減らす
最初は早かったけど運用していく中で遅くなる
- 単純にデータ量の増加
- 機能変更などによりデータアクセスパターンの変化
- アクセス量の増加
大量データ削除で考える事
リソースを奪ってしまい、サービスが停止/遅くなるのを防ぐ。
途中sleepを入れながら、少しずつ削除する。