MySQLのアーキテクチャ
- ストレージエンジンによってデータを格納するレイヤを仮想化
- シングルプロセス / マルチスレッド
- 1つのコネクションに対して1つのスレッドが対応
- すべての更新系クエリを保存するバイナリログ
- 2種類のスレッドで実装された非同期型レプリケーション ...etc
ストレージエンジン
データの格納や抽出、排他制御やトランザクション制側に関するローレベルな実装を仮想化する仕組み。ユーザーがクライアントから SQL文を実行すると、テーブルへのアクセスはすべてストレージエンジンAPIを通じて行われる。
シングルプロセス / マルチスレッドであり、クライアントからの各々の接続に対して、1つのスレッドを作成してレスポンスを返す。MySQL 採用のマルチスレッドでは、スレッド同士は同じメモリを共有しているため連携が高速、同じメモリをアクセスする可能性がある場合には排他処理を必要となる。
InnoDB
MySQL の標準で組み込まれていて、非常に優れた性能と必要十分な機能を備えている。
MVCC ( MultiVersion Concurrency Control ) によって高い同時実行性能を備えており、行単位で排他処理を行うので同じテーブルを複数のセッションから同時にすることも可能。バッファプール(メモリ領域)には、行データの他にインデックスがキャッシュされる。100GB級のメモリをバッファプールに割り当てて、テーブルアクセスの性能向上を図る。
MySQL レプリケーション
MySQL に実装されているものは非同期型。
アプリケーションからの更新を受け付けるマスターと、マスターから更新を受け取るレプリカによって構成される。マスターは更新内容を連続的にレプリカへ転送し、レプリカはその差分を元にテーブルを更新し続ける。
1つのマスターへ行われた更新を同時に複数のレプリカへ転送することも可能。この特性を利用して、参照系のクエリをレプリカから行うことにより負荷分散を行う使い方がよく利用される。Redash の参照用など。
クエリキャッシュ
SELECT を実行すると SELECT文を Key,結果を Value としてメモリ上にキャッシュする。そのため同じ SELECT文であればキャッシュから結果が返される。Key は SELECT文のハッシュ値を計算して利用するため、一字一句まったく同じでないと認識されない。
SELECT の対象になるテーブルが更新された場合、同じ SELECT文によって異なる結果が返ることになるので、そのテーブルからの SELECT を含むキャッシュエントリは無効になる。テーブルの更新が多い場合にはクエリキャッシュはまったく効果がなく、むしろオーバーヘッドとなることもある。参照系のクエリが多い Webサービスでは効果を発揮する。
バイナリログ
ミッションクリティカルシステムにおいて役立つ機能が利用できる。
MySQL のトランザクション
トランザクションはデータベース管理システムの操作の基本単位。トランザクションの管理やデータの格納および抽出の処理は、すべてストレージエンジンに任せられている。MySQL においては InnoDB 。
ACID準拠
- Atomicity (原始性)
- トランザクションの実行結果は、すべての操作が成功するか失敗するかという2通りだけしか存在してはいけない。部分的に成功することはあり得ない。
- Consistency (一貫性)
- トランザクションを実行した結果、それがデータベースにとって論理的に正しいものでなければならない。
- Isolation (分離性)
- Durability (永続性)
- トランザクションを実行した結果が失われてはいけない。
参考