Mysqlにて、クエリのチューニングを集中して行っているため、
せっかくなので気づいた点等をまとめていきたいと思います。
まず、現在実際に行っている、
既に完成しているアプリのSQLチューニング手順。
1. 画面ベース、機能ベースで速度を目視チェック
→体感速度で遅いと感じる画面、機能をピックアップ。
ただし、DBから取得するデータの量や内容によって速度が大幅に変わることはままあるので、
同じ画面、機能でも、データ量や内容のパターンを変えてチェック。
(※一般的に、画面表示までに3秒以上かかるサイトは遅いとされる)
2. 画面遷移時に流れているSQLの速度を計測
→システム等のログにSQLを書き出すようにし、MysqlWorkbench等のツールでSQLを実行して、実行速度を計ってみる。
3. EXPLAIN 関数 を使って遅い要因を判定
→2.のSQLを「EXPLAIN」関数付きで実行してみる
→結合INDEXが張れていない、「using filesort」(=ソート時にIndexが適用されてない)使っている、等の遅くなる要因がないかチェック。
4. 遅いSQLと要因が分かったら、チューニング
→チューニング方法はケースバイケースだが、大概下記の原因・・・なように思う。
・必要なIndexが張れてない
("結合条件として並んでいる順番で"張れていない場合は、Indexが無効になってたりする・・・)
・不要なデータまで検索対象に含めている
(不要なカラムデータまで取得している、もしくは、絞り込み条件の抜け漏れ)
・ソート関数や集約関数
(ORDER BY や GROUP BY。特に、対象データが多い場合や、
関数のKeyにしているカラムにIndexが張れていなかったりする場合)
・無暗やたらなViewの使用、ネスト
(Viewのご利用は計画的に。
むやみにViewを作ったり、ネストさせるのはやめたほうが良いです。。。
多少複雑なSQLにする必要があっても、直TBLアクセスのほうが、
データ量が多くなった場合に困らない事が多いかと。経験上。)
5. チューニングが終わったら、検証
→予め、実装前の画面表示速度を計測しておき、チューニング前後の速度比較をする。
(SQLが多少早くなっても、画面表示が遅い場合、プログラム側の問題があることも・・・)
→影響範囲のチェック
(複数の画面処理から呼ばれているSQL(もしくは、DBアクセス処理)を修正した場合、
他の画面表示時に不具合が発生したり等しないよう、影響範囲のチェックは抜け漏れなく行う)
その他、細かい気付き等はまた別途載せるかもしれないし、
載せないかもしれない。
harupapa