MySQLの基礎知識

はじめに

はじめまして、ALTURA X株式会社でバックエンドエンジニアを担当している山中です。
本記事では弊社でも利用しているMySQLの基礎知識について説明していきます。
MySQLは現在バージョン8がリリースされていますが、本記事で扱う内容はMySQL 5.7時点のものとなります。ただし、基礎知識を学習するという点では大きな問題はないと考えております。

MySQLとは

MySQLはオープンソースのRDBMSで、世界中の多くの企業が使用しています。サポートしているOSもWindows、Linux、Mac、Unix系OSと幅広く、小規模から大規模システムまで柔軟に対応できるという特徴があります。

MySQLのアーキテクチャ

MySQLは以下の図のようなアーキテクチャとなっており、次のような特徴があります。以降は、レプリケーション、オプティマイザ、InnoDB、パフォーマンススキーマについて説明していきます。
  • シングルプロセス・マルチスレッド
  • 1つのコネクションに対して1つのスレッドが対応
  • マスター/スレーブ型のレプリケーション
  • コストベースのオプティマイザ
  • ストレージエンジン(InnoDB等)によりデータを格納するレイヤーを仮想化
  • パフォーマンススキーマによるパフォーマンスの収集と分析
 

レプリケーション

レプリケーションとはマスターとなるデータベースと同一のデータを別のサーバにリアルタイムで複製することで、主な目的としては冗長化や負荷分散などが挙げられます。
MySQLでは複製先をスレーブと表現し、デフォルトでは非同期レプリケーションを使用しますが、プラグインをインストールすることで準同期レプリケーションを使用することもできます。

非同期レプリケーション

非同期レプリケーションとはマスター上で変更が行われた後でスレーブへ変更データを転送しスレーブがマスター上の変更のタイミングとは無関係に変更を実行します。スレーブのデータはマスターとは完全に同期しておらず、ほんのわずかだけ遅れて追随します。そのため、マスターへの負荷は軽減されますが、データの整合性については注意が必要となります。

準同期レプリケーション

準同期レプリケーションはマスター上の変更がスレーブに確実に転送されることを保証し、スレーブが変更データを受け取ったというレスポンスを受け取ってから、クライアントへ応答を返します。ただし、クライアントへ応答が返った時点でのスレーブ上の更新の適用の完了は保証されません。

オプティマイザ

オプティマイザはクエリを実行する際に複数の実行計画から最適なものを選択する機能です。オプティマイザは複数の実行計画のコストを計算する方法により大きく以下の2つに分けることができ、MySQLではコストベースのオプティマイザを使用しています。
  • コストベース
    • SQLを実行するのに取り得る実行計画、つまりSQL文を構文解析して得られたASTと等価な結果を生むASTの組み合わせを探索し、それぞれのコストと比較して最適なものを選ぶ
      • コスト
        • ディスクからページを読み取るコスト
        • 行データを取得するコスト
        • 取得したデータを比較するコスト
    • 一般的にはコストベースのオプティマイザが使用される
  • ルールベース
    • SQL構文やテーブルやインデックスの定義、ヒント句などに従って実行計画を決めるもの
    • 実行計画を意識してSQL構文を組み立てる必要があるため汎用性にかける

EXPLAINコマンド

MySQLではEXPLAINというコマンドでクエリの実行計画を取得することができ、参照したテーブルや使用したインデックス、テーブルのアクセス方法などを確認することができます。ただし、EXPLAINでわかるのは、オプティマイザが最終的に選択した実行計画についてだけで、その過程でどのような最適化やコスト計算、実行計画の比較が行われたかはブラックボックスとなります。

オプティマイザトレース、オプティマイザヒント

MySQLのオプティマイザトレースとはオプティマイザが実行計画を選択する過程を見ることができる機能で、EXPLAINでは表示されないオプティマイザが考慮した実行計画の候補やコストなどの詳細な情報を得ることができます。以下のコマンドでオプティマイザトレースを有効化した後、SQLを実行することで実行計画の情報が表示されます。
MySQLのオプティマイザヒントとは、クエリ実行時にオプティマイザに使うアルゴリズムを指示するための機能で、システム変数を使用して設定します。システム変数を使用した場合、すべてのクエリに有効となってしまうため、以下のようにSQLクエリ内でSELECT句の直後に指示を記載することもできます。

InnoDB

InnoDBはMySQLのデフォルトのストレージエンジンです。ストレージエンジンとはテーブルにデータを読み書きするプログラムで、複数の種類がありそれぞれ処理方法が異なります。MySQLではテーブルごとにストレージエンジンを分けることができます。
InnoDBはACID準拠のトランザクションに対応しており、豊富な機能があり性能的に十分であるため、オールマイティにさまざまな用途で利用できます。また、バッファプールにデータの読み書きへの応答をキャッシュすることで、キャッシュ上にデータが存在する場合はディスク I/O を必要とせずリクエストを高速に処理することができます。

パフォーマンススキーマ

MySQLにはパフォーマンススキーマというMySQLサーバーの動作に関する詳細な情報を提供するために設計された特別なスキーマがあります。パフォーマンス情報の取得は計器と呼ばれるコードを通じて行われ、すべての計器からデータを収集しようとするとオーバーヘッドがかなり大きくなるため取得対象を絞って使用したほうが良いです。取得できる情報としては、各イベントやサーバー上の各種リソース(メモリやファイルディスクリプタなど)の使用状況、データベース内で発生したロックの情報など様々な情報があります。
計器の情報はperformance_schemaデータベースに格納され、計器の各情報を見るには以下のコマンドを実行することで確認することができます。

sysスキーマ

sysスキーマは、パフォーマンススキーマの拡張であり、MySQL本体とは別に開発されたストアドプログラム群です。パフォーマンススキーマは非常に詳細な情報を取得するのに有効であるものの、詳しくない人にとっては情報活用できるようになるまで時間がかかってしまいます。そこで、sysスキーマ(ストアドプログラム群)をインストールすることで、より簡単にパフォーマンススキーマを活用できるようになります。
sysスキーマは様々なビューが用意されており、豊富な情報を使いやすい形式で表示しシステムのパフォーマンスに関する問題を素早く特定し、解決することができます。

最後に

本記事はMySQLの基礎知識について、いくつか内容をピックアップし説明させていただきました。
MySQLはさまざまなシステムで使用されているRDBMSですが、クエリ等の使用方法だけで具体的なアーキテクチャや情報収集方法などは理解できていない方も多いと思います(私もその一人です)。
そのような方が本記事を読み、MySQLをより理解し活用できるようになる一助となれば幸いです。

参考

詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (Kindle:Amazon 本:https://www.seshop.com/product/detail/19425
MySQL 5.7 Reference Manual(https://dev.mysql.com/doc/refman/5.7/en/