SlideShare a Scribd company logo
MySQLMySQL アーキテクチャアーキテクチャ
図解講座図解講座
奥野 幹也
Twitter: @nippondanji
mikiya (dot) okuno (at) gmail (dot) com
@Database Lounge Tokyo #1
免責事項
本プレゼンテーションにおいて示されている見解は、私
自身の見解であって、オラクル・コーポレーションの見
解を必ずしも反映したものではありません。ご了承くだ
さい。
自己紹介
●
MySQL サポートエンジニア
– 日々のしごと
● トラブルシューティング全般
● Q&A 回答
●
パフォーマンスチューニング
など
●
ライフワーク
– 自由なソフトウェアの普及
● オープンソースではない
● GPL 万歳!!
– 最近はまってる趣味はリカンベント(自転車)
●
ブログ
– 漢のコンピュータ道
– http://nippondanji.blogspot.com/
MySQL 5.7 の
アーキテクチャ概要
MySQL のアーキテクチャ
概略図
ストレージエンジンとは
● データの格納と取り出しを担当
– トランザクション管理
● 行アクセスの排他制御
● クラッシュリカバリ
– 統計情報の管理
●
テーブル
● インデックス
– 低レベルの行アクセス API
● 先頭からのスキャン
● 任意のポジションの行を取得
● キーによる検索
● インデックススキャン
etc
ストレージエンジンによる
テーブルスキャンの例
ha_tina::store_lock
ha_tina::external_lock
ha_tina::info
ha_tina::rnd_init
ha_tina::extra - ENUM HA_EXTRA_CACHE Cache record in HA_rrnd()
ha_tina::rnd_next
ha_tina::rnd_next
ha_tina::rnd_next
ha_tina::rnd_next
ha_tina::rnd_next
ha_tina::rnd_next
ha_tina::rnd_next
ha_tina::rnd_next
ha_tina::rnd_next
ha_tina::extra - ENUM HA_EXTRA_NO_CACHE End caching of records (def)
ha_tina::external_lock
ha_tina::extra - ENUM HA_EXTRA_RESET Reset database to after open
オプティマイザ
クエリ実行の流れ
● GNU Bison によるパーサー
● コストベースオプティマイザ
– コスト係数を調整可能
– ストレージエンジンから
統計情報を取得
● 行アクセスやトランザクション管
理はストレージエンジンまかせ
Nested Loop Join
SELECT … FROM t1 INNER JOIN t2 ON … WHERE …
for each row in t1 matching where condition {
for each row in t2 matching join and where condition {
send joined row to client
}
}
Block Nested Loop Join
MySQL が利用する文字コード
InnoDB
教科書通りのトランザクション
対応データストア
InnoDB
ログバッファ
InnoDB
ログファイル
InnoDB
バッファプール
InnoDB
テーブルスペース
クラスターインデックス
InnoDB の分離レベル
分離レベル 分離性 ダーティー
リード
インコンシス
テントリード
ロストアップ
デート
ファントム
READ-
UNCOMMITTED
低 ○ ○ ○ ○
READ-
COMMITTED
× ○ ○ ○
REPEATABLE-
READ
× × ○ ×
SERIALIZABLE 高 × × × ×
●
InnoDB の RR ではファントムは起きない!!
– ただしロッキングリードとノンロッキングリードに注意
ネクストキーロック
● ロッキングリードにおいて
ファントムを防ぐ仕組み
●
行と行の間の仮想的な
空間にロックをかける
●
INSERT をブロック!!
UNDO ログと MVCC
UNDO ログトランケート
UNDO ログ空き領域
UNDO ログ使用中の領域
innodb_max_
undo_log_size
INACTIVE
初期サイズ = 10MB
INACTIVE にして
空になるまで待つ。
その間は他の UNDO
ログファイルで凌ぐ。
UNDO ログ
ファイルを初期化
UNDO ログファイルの
サイズがしきい値を超えた
圧縮テーブル
● innodb_file_format = Barracuda
● CREATE TABLE tblname (…) ENGINE = InnoDB ROW_FORMAT =
COMPRESSED KEY_BLOCK_SIZE=4;
バッファプールが
二重に消費される。
オーバーヘッド大。
透過的テーブル圧縮
CREATE TABLE tblname
(…) ENGINE = InnoDB
COMPRESSION = lz4;
透過的テーブルスペース
暗号化の仕組み
レプリケーション
レプリケーションの概要
準同期レプリケーション
バイナリログの
グループコミット
スレーブ上で並列化可能な
トランザクション
マルチスレッドスレーブ
LOGICAL_CLOCK モード
パフォーマンス
スキーマ
パフォーマンススキーマ
vs 情報スキーマ
パフォーマンススキーマ 情報スキーマ
主目的 パフォーマンスデータの取得 メタデータの取得
アプリケーション パフォーマンスチューニング 監視ツールや管理ツール
導入されたバージョン 5.5 5.1
SQL 標準? いいえ はい
実装方法 ストレージエンジンのひとつ 情報スキーマ API
データ収集のタイミング mysqld 内部で任意のタイミ
ングでコード実行時
情報スキーマテーブルアクセ
ス時
通常時のオーバーヘッド あり なし
表示によるオーバーヘッド 少ない 大きい
類似のツール DTrace, SystemTap SHOW コマンド
計器( Instrument )
コンシューマー
●
計器をグループ化
● パフォーマンスデータを保
存するメモリ領域
宣伝: 新書籍「詳解 MySQL 5.7 」
● MySQL 5.7 の新機能を網羅
– 175 もの新機能を解説
– 新機能の理解に欠かせ
ないアーキテクチャの話
も盛りだくさん
– 本日解説しなかった新
機能も詳しく解説!!
●
8 月 23 日発売予定
Q&Aご静聴ありがとうございました。

More Related Content

MySQLアーキテクチャ図解講座