MyISAMとInnoDBについて
公開日:
:
MySQL
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
[ThinkIT] 第2回:MyISAMとInnoDB (1/3)を参考にしながら勉強する。
- MyISAM
- MySQLのデフォルトストレージエンジン
- ストレージエンジンを指定せずにテーブルを作成するとMyISAMが選択される
- InnoDB
- 豊富なトランザクション機能を提供するストレージエンジン
ディレクトリ構造
以下のような感じ。
- データベースディレクトリ/
- バイナリログファイル
- バイナリログファイル
- バイナリログファイル
- バイナリログファイル
- mysql/
- test/
- ユーザデータベースを作成するディレクトリ/
この構造は、使用するストレージエンジンに関係なく共通。
MyISAMのテーブルファイル
データベース名のサブディレクトリ内に、以下のファイルが作成される。
- テーブル名.frm
- テーブル構造
- テーブル名.MYD
- レコードデータ
- テーブル名.MYI
- インデックスと統計情報
MyISAMテーブルの特長
以下の種類のデータ構造がある。
- 固定長構造
- 可変長構造
- 圧縮テーブル
データ構造は
show table status
で確認できる。
固定長構造
- カラムのデータ型にVARCHAR、TEXT、BLOBを含んでいない場合に選択される
- レコードの削除が行われた時に削除されたデータ領域の再利用が容易
- 「データのフラグメンテーション」が発生しない
- レコードデータに「row number」と呼ぶレコードを一意に識別する値が付けられる
- 「row number」を利用して高速に該当レコードを探し当てることができる
可変長構造
- テーブルを構成するカラムのデータ型にVARCHAR、TEXT、BLOBを含んでいる場合に選択される
- レコードを削除した場合のデータ領域の再利用が難しいため、データのフラグメンテーションが発生する可能性がある
- フラグメンテーションが発生するとディスクの利用効率が低下するため、検索性能が劣化する
- 一定周期でこのデータのフラグメンテーションを取り除く処理を実施する必要がある
圧縮テーブル
- 読み取り専用
- 自動で選択されるものではなく、オプションユーティリティ(myisampack)を用いてユーザが作成する
- 固定長構造/可変長構造ともに、圧縮テーブル構造に変更することが可能
InnoDBのディレクトリ構造とファイル
- テーブルを作成する際にInnoDBを選択すると、データベース名のサブディレクトリ内には、「テーブル名.frm」ファイルのみが作成される
- InnoDBのテーブルのレコードデータやインデックスデータは、テーブルスペースと呼ばれるファイル内に格納する
- テーブルスペースとは、標準ではデータベースディレクトリ内に「ibdata1」という名称で作成されるファイルのこと
- テーブル構造のデータは、テーブル名.frmファイル内だけでなく、テーブルスペース内にも格納される
InnoDBテーブルの特徴
- InnoDBのテーブルは、クラスタードインデックスと呼ばれる特別なインデックスを備えた構造にて、テーブルスペースの中に格納される
- リーフと呼ぶインデックスの最下位レベルの部分がテーブルのレコードそのものになっている構成のインデックス
- テーブル内のレコードはインデックス値の順に並んでいる
- Oracleでは、この構成を索引構成表と呼ぶ
トランザクション機能について
- MyISAMエンジンはトランザクション機能を持っていませんが、MyISAMテーブルは更新できないわけではない
- INSERT/UPDATE/DELETEすべて実行可能
- トランザクション機能を持っていない分、非常に軽快に動作する
- MyISAMのテーブルのロック単位はテーブル単位で、InnoDBのテーブルはレコード単位
InnoDBエンジンのトランザクション機能
- Oracle相当の読み込み一貫性機能を持つ
- ロック単位はレコード単位で、ロックのエスカレーションがない
- トランザクションの分離レベルは4つ持つ
- リードアンコミッティド
- リードコミッティド
- リピータブルリード
- シリアライザブル
InnoDBエンジンのトランザクションログ
- InnoDBは、トランザクションログのファイル群としてデータベースディレクトリ内の「ib_logfole0」ファイルと「ib_logfile1」ファイルを使用