あらすじ
MySQLの事をほぼ理解していないサーバサイドエンジニアが、とある本を読んでMySQLのアーキテクチャから学んでいこうと思います。
どなたかの参考になればと思っています。また有識者からの突っ込み等もいただければと思っています。(お手柔らかにお願いします。。。)
前提条件
- MySQL -> 5.7
MySQLのアーキテクチャ
MySQLサーバはOS上では一つのプロセスとして動作し、クライアントからのSQLの処理やディスク上のデータの読み書きを内部の複数のスレッドが担当する**「シングルプロセスマルチスレッド型」**です。内部の実装は下記のような構造になっています。
- 接続の管理やSQLの構文解析
- ユーザ認証、権限管理
- 接続
- SQL文構文解析&実行計画最適化
- データやトランザクションの管理
データやトランザクションの管理には用途に応じてどのストレージエンジンを利用するかが選択可能です。なので、運用管理やパフォーマンスチューニングのためにも、各ストレージエンジンが持つ機能や特徴の理解が重要
です。
ユーザ認証 & 権限管理
ACLを用いてアクセス認証や権限管理を行っています。
接続
新規の接続が行われると処理を担当するスレッドが生成され、ユーザ認証後にSQL文が発行され実行します。接続が切断されると処理スレッドは破棄されます。
ただしスレッドキャッシュ機能を利用している場合は、スレッドは破棄されずプールに格納され、次の接続時に再利用されることでスレッド生成や破棄の処理を削減できます
SQL構文解析 & 実行計画最適化
実行されたSQLを処理するために、パーサーによって構文解析を行い内部のAPIに変換され、オプティマイザによって最も効率的なデータへのアクセス経路を導き出す最適化を行います。
キャッシュ
処理のボトルネックになりがちなのが、ディスクやストレージです。そのためアクセス削減のためにキャッシュ(またはバッファ)の仕組みを持っています。MySQLではストレージエンジン固有のキャッシュやサーバ全体で利用するキャッシュなど複数の仕組み
が用意されています
ストレージエンジン
ストレージエンジンには下記の役割があります
- データフォーマットの定義
- データ永続化
- インデックス管理
- トランザクション管理
- ロックと排他制御
- 各ストレージエンジン固有の機能(下記はInnoDBの場合)
- 全文検索
- 自動クラッシュリカバリ
InnoDBは多くのアプリケーションで必要となるACID特性をもったトランザクションを、MySQL5.7で唯一サポートしているストレージエンジンです。特別な理由がない限り標準のInnoDBを利用しておけば十分なケースがほとんど
です。(以前は、参照性能が高いなどの理由でMyISAMストレージエンジンがデフォルト)
まとめ
皆さんいかがでしたでしょうか?MySQLのアーキテクチャについて少しでも理解を深めることができたでしょうか?
やっぱりストレージエンジン周りの理解がキモになってきそうな予感をしています。なのでお次はもう少し詳細に幾つかのストレージエンジンについて学んでいこうと思います。
ではまたの機会に。。。