実践ハイパフォーマンスMySQL 第2版 (1章)
今の会社で、自分が入社する前から会社で行われている本書の読書会に自分も追いつくべく読み始めました。
感想を書きたいところですが、「1章は概要」+「イマイチ理解出来ていない」ということで、ただの自分用メモな箇条書きになっています。公開してすみません。。
トランザクション
Atomicity(不可分性)
- やるかやらないか、ただそれだけ。
Consistency(一貫性)
- 矛盾はダメ。
Isolation(分離性)
- 別トランザクションに影響されない。
Durability(永続性)
- 確定したデータは消えない。
データ書き込み
- データはメモリ上のみで更新して、ディスクにはログだけを書き込みことで高速に操作することが出来る。
- ログの書き込みは狭い範囲へのシーケンシャルなI/Oとなるため。
マルチバージョンの並行性制御(MVCC)
- 行ロックにひねりを加えたもの。
- InnoDBではレコードに行が作成されたタイミングと削除されたタイミングを、システムバージョン番号で記録しその番号をもとに処理を行う。
SELECT
INSERT
- 現在のシステムバージョン番号を記録する。
DELETE
- 現在のシステム番号を削除バージョンとして記録する。
UPDATE
- 更新後データを新しいシステムバージョン番号を記録して書き出す。
- 更新前データの削除バージョンとして現在のシステムバージョン番号として記録する。
ストレージエンジン
- MySQLのテーブル定義はデータディレクトリの下にあるデータベース名ディレクトリの中に「テーブル名.frm」という拡張子がついて置かれている。
- テーブルのストレージエンジンを知るには下記SQLを実行する。
mysql> SHOW TABLE STATUS LIKE 'テーブル名'\G
MyISAM
- 5.5ではデフォルトのストレージエンジンがInnoDBになっていたりとどんどん使われること状況が少なくなりつつあるのかなと思っていますがその特徴を。。
- データファイルは「.MYD」、インデックスは「.MYI」ファイルに保存されている。プラットフォーム依存していないので、ファイルを別プラットフォームのマシンに持っていって使うことが出来る。
- テーブルロック。選択クエリが実行されているテーブルに対して新しい行を挿入することが可能。
- 自動修復と手動修復
- BLOBとTEXTで最初の500文字でインデックスを作成することが出来る。全文インデックスをサポートしている。
- 遅延キー書き込み(頻繁に変化する使用頻度の高いテーブルのパフォーマンスを向上させることができる。)
- myisampackユーティリティにより、読み取り専用の圧縮されたテーブルを作成することが出来る。圧縮によりI/Oが減るのでパフォーマンスが向上する。
メモリエンジン
- キャッシュのような使い方で、変化しなくて再起動後に残っている必要がないデータを入れる。(郵便番号など)
- テーブルロックで固定長だけをサポートする。
Archiveエンジン
- INSERTとSELECTクエリのみをサポートし、データ書き込みをバッファリングし挿入時にzlibで圧縮する。
- ログの記録などに向いている。高速にINSERTが出来るので、レプリケーションマスタで使うなど。
Federatedエンジン
- ローカルにデータを格納せずに全ての操作をリモートサーバーに接続して行う。
Blackholeエンジン
- Insertを格納せずに棄てる。クエリはログに記録されるので監査したい時などに使う?
NDB Clusterエンジン
- すごく複雑らしい。サーバーRAIDのように、データの断片を複数ノードに分散して格納する。同じ断片が複数のノードが存在するので冗長性と高可用性がある。
Falconエンジン
- これが執筆された段階では未完成だった。
solidDBエンジン
- 悲観的な並行性制御と楽観的な並行性制御の両方をサポートしている。
- InnoDBに似ている点も多く、オンラインバックアップ機能が無償で含まれている。
PBTXエンジン
Maria DB
注意点
ストレージエンジン選びの例
- 読み取り専用または読み取りがメインのテーブル
- クラッシュすることを許容出来るのであればMyISAMが高速。
- 株式指標テーブル
- 掲示板やフォーラムテーブル
- 2章で!
- CD-ROMアプリケーションに格納するテーブル
- 圧縮したMyISAMがいい。
テーブル変換
- ALTER TABLE
- 古いテーブルから新しいテーブルへの行単位のコピーを実施するので遅い。
- ストレージ固有の機能は無効になる。
mysql> ALTER TABLE hoge ENGINE = InnoDB
- ダンプとインポート
- 細かく制御することが出来るけど、注意してやらないと誤操作でデータを失う恐れがある。
- CREATE と SELECT
- 新しいテーブルを作成し、そこにINSERT ... SELECT でデータを入れる。
# old_table は MyISAMとする # 古いテーブルと同じ定義の新しいテーブルを作る mysql> CREATE TABLE new_table LIKE old_table; # 新しいテーブルの定義をInno DBに mysql> ALTER TABLE new_table ENGINE=InnoDB; # 古いテーブルのデータを新しいテーブルに流し込む mysql> INSERT INTO new_table SELECT * FROM old_table;
まとめ
- 1章から難しかったです。。でも2章からも頑張って読もうと思います!