チューニングとは?
1 パフォーマンスチューニングとは
データベースのパフォーマンス(性能)の向上をはかることであり、主に次のような性能の向上を目安としています。
・スループットの向上は多くの場合に応答時間の向上につながりますが、ある重要な問い合わせの応答時間を短縮するために全体的なスループットを犠牲にするケースもあります。
・今回の記事では、データ量増加への対応ではなく、実行速度の向上につながる応答時間とスケーラビリティに主眼を置いてご紹介
2 サーバチューニングとは
・サーバ全体のパフォーマンスを向上させることにより、主にスループットの向上をはかります。
・より高性能なハードウェアへのリプレース以外で行えるチューニングは、主にパラメータ(システム変数やステータス変数)の最適化をはかることになります。
・my.iniやmy.cnfなどの設定ファイルの修正で行うことができますが、詳しいご紹介はまた別の機会に
3 SQLチューニングとは
処理速度の向上をはかること
・個々のSQLを見直し
・インデックスの追加やデータ型の見直し
・テーブルやカラムに関する部分についても見直し
SQLチューニングのポイント
1 データ型の見直し
テーブルに設定したデータ型と入力したデータのデータ型を同一する
2 インデックスの追加と削除
頻繁に発行するクエリの実行計画を調査し適したインデックスを追加することで、劇的な速度向上が期待できる。
(1) インデックスとは
・データベース内から特定のデータを検索しやすくするための仕組
・MySQLでは、B-Tree方式
インデックスを貼られたカラムは検索しやすいようツリー構造に加工され、テーブル本体とは別の場所に保存されます。
検索する際にはその加工したデータの方を見に行くことで、高速化を図っている
(2) インデックスを貼るメリット
適切なカラムにインデックスを貼って、検索の高速化
(対象:SQL文を多用する予定であるかを考え、実行計画を確認)
(3) インデックスを貼るデメリット
①データの保存に必要な領域が増える (理由:テーブル本体とは別の領域に保存される)
②レコードの追加・更新については少し遅くなる (理由:インデックスも追加・更新する処理が行われる)
(4) インデックスを貼る対象を探す「EXPLAIN」
「possible_key」:そのSQLを実行する際に有効なインデックスを貼る候補に挙がっているカラム名
「key」:現在インデックスが貼られているカラム名
(5) インデックスの追加
ALTER TABLE [テーブル名] ADD INDEX インデックス名;
例:ALTER TABLE db_01.USER_DATA ADD INDEX index01(user_id);
複合インデックスを追加する場合
例:ALTER TABLE db_01.USER_DATA ADD INDEX index02(user_id, user_name)
(6) インデックスの削除
ALTER TABLE [テーブル名] DROP INDEX [インデックス名];
例:ALTER TABLE db_01.USER_DATA DROP INDEX index01;
3 SQLの見直し
無駄なループをなくすなどの処理を見直したり、実行が遅い命令を早い命令に置き換えるなどで対応
例:
①「UNION」より「UNION ALL」を使用
(理由:重複行削除のための処理が行われるためその分時間が必要)
②SELECT時に[*]より「項目名」を使用
(理由:[*]を項目名に置き換える処理が内部で行われるため)
③「サブクエリー」より「join」を使用
(理由:「サブクエリー」はindexが消える可能性ある)
4 ストアドプロシージャの削除
コールするだけで使用できるストアドプロシージャですが、普通にクエリを発行するよりも実行に時間がかかる場合がある
5 非正規化で処理速度が向上する?
データベースを正規化しすぎると、検索時にたくさんの表を結合する必要が出てくることから処理速度が低下すると長年言われてきました。
しかし正規化による結合は処理速度の低下に必ずしも影響しないということを示す実証実験の結果も公開されています。
今のところ、正規化は行った方がメリットが大きいようです。
スロークエリログで問題点を発見する
1 スロークエリログとは
・MySQLから出力されるログの一種
・設定した時間以上に処理時間がかかったクエリが出力
2 スロークエリログの使い方
スロークエリログの詳細な設定方法や出力内容の読み方
(1) スロークエリログとは
実行に時間のかかったクエリがあった際に記録されるログ
(2) スロークエリログの出力設定 (例:コールシェア)
/etc/my.cnf