MySQL8.0でのMyISAMとInnoDBの違いを比較

MySQL8.0でのストレージエンジンのMyISAMとInnoDBの違いについて書いていきます。

まず公式ページの記載は以下となっています。

MyISAM

fw_error_www
fw_error_www

InnoDB

fw_error_www
fw_error_www

公式ページを見つつ、MyISAMとInnoDBの違いについて記載していきます。

MySQL8.0でのMyISAMとInnoDBの違いについて、結論は以下の通りとなります。

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ということになります。

地理空間については以下の公式ページをご参照いただければと!

fw_error_www
fw_error_www

MyISAMとInnoDBの歴史をたどってきました。

MyISAMにあってInnoDBに無かった機能が、InnoDBでもサポートされるようになり、InnoDBの強化が行われてきたことが分かると思います。

 

次に、MySQL8.0でのMyISAMとInnoDBの違いについて詳細を記載していきます!

MySQL8.0でのMyISAMとInnoDBの違い

以下の点について、記載していきます。

MyISAMとInnoDBの違い

<MyISAM>
トランザクション機能なし
ロックの粒度:テーブル
外部キー機能なし
<InnoDB>
トランザクション機能あり
ロックの粒度:行
外部キー機能あり

トランザクション機能

トランザクション機能は、InnoDBにあって、MyISAMにはない機能になります。

トランザクション機能を活用することで、中途半端な状態でデータが登録・更新されることを防ぐことができます。

トランザクションについて、例えば、テーブルAとテーブルBを一度に更新したいケースでは、トランザクションを使うと、テーブルAを更新してテーブルBの更新に失敗した場合、テーブルAの更新も無かったことにできる(ロールバックできる)機能を指しています。

これにより、データの整合性が保ちやすくなります。

ロックの粒度

InnoDBでは行、MyISAMではテーブル単位でのロックとなります。

テーブル単位でのロックですと、テーブルAに対する更新処理を二人で同時に行った場合、最初の一人の処理が終わるまで、二人目の処理は待たされることになります。

一方、行単位でのロックですと、テーブルAに対する更新処理を二人で同時に行った場合でも、更新するレコードが異なれば、最初の一人の処理と並行して、二人目の処理も実行されることになります。

行単位のロックの方が、ロック解除待ちが発生する可能性が少ないということになります。

外部キー機能

外部キー機能は、InnoDBにあって、MyISAMにはない機能になります。

外部キー機能を使って、テーブル同士の紐づけに用いるカラム指定することができます。

例えば、親子関係のあるテーブルに外部キーを貼ると、親テーブルのみデータ削除して、削除したデータに紐づく小テーブルのデータは削除しないといったことができなくなる制約が発生します。これにより、データの整合性を保ちやすくなります。

まとめ

MySQL8.0でのMyISAMとInnoDBの違いについて、まとめると以下のようになると思います。

MyISAMとInnoDBの違い

<MyISAM>
トランザクション機能なし
ロックの粒度:テーブル
外部キー機能なし
<InnoDB>
トランザクション機能あり
→メリット:データの整合性を保ちやすくなる
ロックの粒度:行
→メリット:ロック待ちの頻度が下がる
外部キー機能あり
→メリット:データの整合性を保ちやすくなる

昔はInnoDBでは使えなかった「全文検索インデックス」や「地理空間インデックス」もInnoDBで使えるようになり、InnoDB素晴らしーいという結論です。