MySQLの基礎知識
レプリケーション
レプリケーションとはマスターとなるデータベースと同一のデータを別のサーバにリアルタイムで複製することで、主な目的としては冗長化や負荷分散などが挙げられます。
MySQLでは複製先をスレーブと表現し、デフォルトでは非同期レプリケーションを使用しますが、プラグインをインストールすることで準同期レプリケーションを使用することもできます。
非同期レプリケーション
非同期レプリケーションとはマスター上で変更が行われた後でスレーブへ変更データを転送しスレーブがマスター上の変更のタイミングとは無関係に変更を実行します。スレーブのデータはマスターとは完全に同期しておらず、ほんのわずかだけ遅れて追随します。そのため、マスターへの負荷は軽減されますが、データの整合性については注意が必要となります。
準同期レプリケーション
準同期レプリケーションはマスター上の変更がスレーブに確実に転送されることを保証し、スレーブが変更データを受け取ったというレスポンスを受け取ってから、クライアントへ応答を返します。ただし、クライアントへ応答が返った時点でのスレーブ上の更新の適用の完了は保証されません。
オプティマイザ
オプティマイザはクエリを実行する際に複数の実行計画から最適なものを選択する機能です。オプティマイザは複数の実行計画のコストを計算する方法により大きく以下の2つに分けることができ、MySQLではコストベースのオプティマイザを使用しています。
- コストベース
- SQLを実行するのに取り得る実行計画、つまりSQL文を構文解析して得られたASTと等価な結果を生むASTの組み合わせを探索し、それぞれのコストと比較して最適なものを選ぶ
- コスト
- ディスクからページを読み取るコスト
- 行データを取得するコスト
- 取得したデータを比較するコスト
- 一般的にはコストベースのオプティマイザが使用される
- ルールベース
- SQL構文やテーブルやインデックスの定義、ヒント句などに従って実行計画を決めるもの
- 実行計画を意識してSQL構文を組み立てる必要があるため汎用性にかける
EXPLAINコマンド
MySQLではEXPLAINというコマンドでクエリの実行計画を取得することができ、参照したテーブルや使用したインデックス、テーブルのアクセス方法などを確認することができます。ただし、EXPLAINでわかるのは、オプティマイザが最終的に選択した実行計画についてだけで、その過程でどのような最適化やコスト計算、実行計画の比較が行われたかはブラックボックスとなります。
オプティマイザトレース、オプティマイザヒント
MySQLのオプティマイザトレースとはオプティマイザが実行計画を選択する過程を見ることができる機能で、EXPLAINでは表示されないオプティマイザが考慮した実行計画の候補やコストなどの詳細な情報を得ることができます。以下のコマンドでオプティマイザトレースを有効化した後、SQLを実行することで実行計画の情報が表示されます。
MySQLのオプティマイザヒントとは、クエリ実行時にオプティマイザに使うアルゴリズムを指示するための機能で、システム変数を使用して設定します。システム変数を使用した場合、すべてのクエリに有効となってしまうため、以下のようにSQLクエリ内でSELECT句の直後に指示を記載することもできます。
パフォーマンススキーマ
MySQLにはパフォーマンススキーマというMySQLサーバーの動作に関する詳細な情報を提供するために設計された特別なスキーマがあります。パフォーマンス情報の取得は計器と呼ばれるコードを通じて行われ、すべての計器からデータを収集しようとするとオーバーヘッドがかなり大きくなるため取得対象を絞って使用したほうが良いです。取得できる情報としては、各イベントやサーバー上の各種リソース(メモリやファイルディスクリプタなど)の使用状況、データベース内で発生したロックの情報など様々な情報があります。
計器の情報はperformance_schemaデータベースに格納され、計器の各情報を見るには以下のコマンドを実行することで確認することができます。
sysスキーマ
sysスキーマは、パフォーマンススキーマの拡張であり、MySQL本体とは別に開発されたストアドプログラム群です。パフォーマンススキーマは非常に詳細な情報を取得するのに有効であるものの、詳しくない人にとっては情報活用できるようになるまで時間がかかってしまいます。そこで、sysスキーマ(ストアドプログラム群)をインストールすることで、より簡単にパフォーマンススキーマを活用できるようになります。
sysスキーマは様々なビューが用意されており、豊富な情報を使いやすい形式で表示しシステムのパフォーマンスに関する問題を素早く特定し、解決することができます。