MySQL8.0でのストレージエンジンのMyISAMとInnoDBの違いについて書いていきます。
まず公式ページの記載は以下となっています。
MyISAM
InnoDB
公式ページを見つつ、MyISAMとInnoDBの違いについて記載していきます。
MySQL8.0でのMyISAMとInnoDBの違いについて、結論は以下の通りとなります。
<MyISAM>
トランザクション機能なし
ロックの粒度:テーブル
外部キー機能なし
<InnoDB>
トランザクション機能あり
ロックの粒度:行
外部キー機能あり
MyISAMとInnoDBで迷ったら、多くの主要な機能が備わっているInnoDBを選択しましょ!
MyISAMとInnoDBの違いについて詳細を記載する前に、MyISAMとInnoDBの歴史について書いていきます!
MyISAMとInnoDBの歴史
以下のポイントに絞って、MyISAMとInnoDBの歴史をたどっていきます!
デフォルトストレージエンジン
全文検索インデックスのサポート
→MySQL 5.7からInnoDBでもサポート
地理空間インデックスのサポート
→MySQL 5.6からInnoDBでもサポート
デフォルトストレージエンジン
MySQL バージョン5.5より前のバージョンでは、MyISAMがデフォルトストレージエンジンでしたが、バージョン5.5からInnoDBがデフォルトストレージエンジンとなりました。
デフォルトストレージエンジンとは、以下のようにストレージエンジンを指定せずに、テーブル作成した際に選択されるストレージエンジンを指しています。
create table user(
id INT,
type INT,
name VARCHAR(255)
);
上記のSQLでテーブルを作成すると、MySQL5.5以降ではデフォルトストレージエンジンのInnoDBでテーブルが作成されます。 MySQL バージョン5.5より前のバージョンでは、MyISAMでテーブルが作成されます。
ストレージエンジンを指定したい場合は、テーブル作成時にストレージエンジンを以下のように明記します。
<MyISAMを指定してテーブル作成時>
create table user(
id INT,
type INT,
name VARCHAR(255)
) engine MyISAM;
<InnoDBを指定してテーブル作成時>
create table user(
id INT,
type INT,
name VARCHAR(255)
) engine InnoDB;
全文検索インデックスのサポート
全文検索インデックスは、MyISAMがサポートしている機能でしたが、MySQL 5.7からInnoDBでもサポートされるようになりました。
MySQL 5.7より前の時代では、全文検索したい場合は、MyISAMを選択肢として挙げられていたかと思いますが、MySQL 5.7から全文検索したい場合もInnoDBでOKということになります。
地理空間インデックスのサポート
地理空間インデックスもMyISAMがサポートしている機能でしたが、MySQL 5.6からInnoDBでもサポートされるようになりました。
MySQL 5.6より前の時代では、地理空間インデックスを使いたい場合は、MyISAMを選択肢としていたかと思いますが、MySQL 5.6からはInnoDBでOKということになります。
地理空間については以下の公式ページをご参照いただければと!
MyISAMとInnoDBの歴史をたどってきました。
MyISAMにあってInnoDBに無かった機能が、InnoDBでもサポートされるようになり、InnoDBの強化が行われてきたことが分かると思います。
次に、MySQL8.0でのMyISAMとInnoDBの違いについて詳細を記載していきます!
MySQL8.0でのMyISAMとInnoDBの違い
以下の点について、記載していきます。
<MyISAM>
トランザクション機能なし
ロックの粒度:テーブル
外部キー機能なし
<InnoDB>
トランザクション機能あり
ロックの粒度:行
外部キー機能あり
トランザクション機能
トランザクション機能は、InnoDBにあって、MyISAMにはない機能になります。
トランザクション機能を活用することで、中途半端な状態でデータが登録・更新されることを防ぐことができます。
トランザクションについて、例えば、テーブルAとテーブルBを一度に更新したいケースでは、トランザクションを使うと、テーブルAを更新してテーブルBの更新に失敗した場合、テーブルAの更新も無かったことにできる(ロールバックできる)機能を指しています。
これにより、データの整合性が保ちやすくなります。
ロックの粒度
InnoDBでは行、MyISAMではテーブル単位でのロックとなります。
テーブル単位でのロックですと、テーブルAに対する更新処理を二人で同時に行った場合、最初の一人の処理が終わるまで、二人目の処理は待たされることになります。
一方、行単位でのロックですと、テーブルAに対する更新処理を二人で同時に行った場合でも、更新するレコードが異なれば、最初の一人の処理と並行して、二人目の処理も実行されることになります。
行単位のロックの方が、ロック解除待ちが発生する可能性が少ないということになります。
外部キー機能
外部キー機能は、InnoDBにあって、MyISAMにはない機能になります。
外部キー機能を使って、テーブル同士の紐づけに用いるカラム指定することができます。
例えば、親子関係のあるテーブルに外部キーを貼ると、親テーブルのみデータ削除して、削除したデータに紐づく小テーブルのデータは削除しないといったことができなくなる制約が発生します。これにより、データの整合性を保ちやすくなります。
まとめ
MySQL8.0でのMyISAMとInnoDBの違いについて、まとめると以下のようになると思います。
<MyISAM>
トランザクション機能なし
ロックの粒度:テーブル
外部キー機能なし
<InnoDB>
トランザクション機能あり
→メリット:データの整合性を保ちやすくなる
ロックの粒度:行
→メリット:ロック待ちの頻度が下がる
外部キー機能あり
→メリット:データの整合性を保ちやすくなる
昔はInnoDBでは使えなかった「全文検索インデックス」や「地理空間インデックス」もInnoDBで使えるようになり、InnoDB素晴らしーいという結論です。