この記事は Still using MyISAM ? It is time to switch to InnoDB ! の翻訳版です。
InnoDBは、バージョン5.5(2010年7月!)以降、MySQLのデフォルトストレージエンジンとなっています。
テーブルのストレージエンジンとしてまだMyISAMを使用している場合は、InnoDBへの移行を検討するタイミングかもしれません。InnoDBは、MyISAMに比べていくつかのメリットがあります。
- MVCC
- ACIDトランザクションのサポート
- 行レベルのロック
- クラッシュリカバリー機能
- 外部キー
- ホットバックアップ
- クローン生成機能
さらにMyISAMと比較して、InnoDBはより信頼性が高くデータの破損も発生しづらくなっています。
InnoDBストレージエンジンは、ホットバックアップを実行する機能も提供し、素晴らしいクローン生成機能もサポートしています。
しかし、いくつかの理由からMyISAMを使用している人もまだいらっしゃるでしょう。
よく言われる理由を見てみましょう。
性能
性能が一番大事なのに「MyISAMの方が速い」なんて…。
一般的にパフォーマンスを比較すると、5.7以降はInnoDBの方が高速です。DimitriKはこの記事でこの点について説明しています。そして8.0では、InnoDBの性能は向上し続けています。
また、一時テーブルではMyISAMの方が良いというフィードバックがありますが、MySQL 8.0では、ディスク上の内部一時テーブルのストレージエンジンはInnoDBのみとなりました。なぜInnoDBがディスク上の内部テンポラリテーブルのデフォルトになったかは、この記事でご確認ください。
MySQL 8.0以前は、MyISAMがInnoDBより性能が良いケースが1つだけありました。それはバルクロード時の高インサートレートです。これは、MyISAMがMVCCを持たず、耐久性がないためでした。MySQL 8.0では、InnoDBの耐久性を無効にすることでREDOログを無効にすることができてバルクロードの実行時に高インサートレートを実現することができます。
並列処理が追加される前は、COUNT(*)はMyISAMの方が速かったです。しかし、もはやそうではありません。
InnoDBはマルチコアCPUを活用するように設計されているため、複数のコアを使用して並列処理を行い、最新のハードウェアでより良いパフォーマンスを実現することができるのです。
ストレージへの負荷
InnoDB は MyISAM よりも多くのディスクスペースを消費します。ページを圧縮した場合でも同様ですが、これはMVCCをサポートするために支払うべき代償でもあります。JFGはこのことをブログ記事で非常に明確に説明しています。ストレージは数十年前のように広大なものではなく、行ロックによるディスクスペース消費や永続性を選択するかどうか決断する必要があります。
パーティショニンング
MySQL 8.0では、現在InnoDBのみがネイティブなパーティショニングを提供しています。したがって、ワークロードにパーティショニングが必要な場合、8.0への移行を計画しているのであれば、MyISAMは選択肢になりません。
ネイティブGIS
「GISはMyISAMでしかサポートされていない」これは時々耳にする言葉です。MySQL8.0では、InnoDBのGISサポートに大きな進歩があり、Norvaldの資料でそれを知ることができます。
InnoDBは、GISに関連するすべてのニーズをカバーしています。
全文検索
MySQL 5.6からInnoDBは全文検索をサポートし、MyISAMの3倍以上のスケーリングを実現しています(こちら)。もちろん、MySQL 8.0でもInnoDBの全文検索をサポートし続け、CJK、ngram、mecabをサポートしています(全文検索を利用する予定の方はMatt Lordのスライドを参照してください)。
高可用性
MySQL InnoDB Cluster(HA用)、InnoDB CluserSet(DR用)、どちらもグループレプリケーションに基づき、InnoDBを必要とします。
本当の高可用性やディザスタリカバリのソリューションを探しているのであれば、MyISAMは選択肢になりません。
クラウド
MySQLのマネージドサービスには、MyISAMが含まれているものはありません。そしてこれは、Oracle Cloud InfrastructureのMySQL HeatWave Database Serviceの場合も同様です。
主要なクラウドプロバイダーすべてがMyISAMを提供しないのに、なぜMyISAMを選択するのでしょうか?
MyISAMからInnoDBへのテーブルの変換
MySQL ドキュメントに詳細なセクションがあります:MyISAMからInnoDBへのテーブルの変換
多くの場合、移行は複雑ではなく、以下のようにまとめることができます。
alter table <table_name> engine=InnoDB;
上記を実行したら、次のパラメタ設定も忘れずに実行してください。
set persist_only disabled_storage_engines='MyISAM';
結論
MyISAMからInnoDBへの移行は、MySQLデータベースの利用に際して大きなメリットがあります。InnoDBは、より優れたパフォーマンス、信頼性、およびスケーラビリティを提供し、最新のアプリケーションのデフォルトの選択肢となります。データを堅持し、高可用性やディザスタリカバリに対応する予定であれば、InnoDBは唯一可能な選択です。

