はじめに
こんにちは。
業務で過去に作成されたDDLを読んでいると、次のようにテーブル定義の末尾に ENGINE=InnoDB と書かれているのをよく見かけます。
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL
) ENGINE=InnoDB;
テーブルによって書かれているものもあれば書かれていないものもあり、初めて見たときには少し混乱した記憶があります。
今回は、この ENGINE=InnoDB が何を意味しているのか、ENGINEとInnoDBとはそれぞれ何なのかについて調べたことをまとめます。
実行環境
- MySQL 8.0.46
ENGINE=InnoDBは何を意味しているか
ENGINE=InnoDB は 「このテーブルではInnoDBというストレージエンジンを使用する」 ということを意味しています。
ENGINE はテーブル作成時のオプションです。ENGINE= のあとにそのテーブルのストレージエンジンを指定します。
ストレージエンジンとは?
ストレージエンジンは、データベースのデータの保存・読み書きなどの処理を担う部分です。
MySQLでは、テーブルごとにストレージエンジンを指定できます。InnoDB以外にも、MyISAM、MEMORY、CSV などといったストレージエンジンがあります(後述)。
ENGINEを指定しなかったらどうなる?
テーブル作成時にENGINEを指定しなかった場合、MySQL5.5以降ではデフォルトでInnoDBを指定してテーブルが作成されます。
公式ドキュメントでは次のように説明されています。
デフォルトでは、テーブルはInnoDBストレージエンジンを使用してデフォルトデータベースに作成されます。
テーブルのエンジンを確認する
既存のテーブルがどのストレージエンジンを使っているかは、以下のSQLで確認できます。
LIKE句やWHERE句を使って対象のテーブルを指定することもできます。
SHOW TABLE STATUS;
表示例:
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| users | InnoDB | 10 | Dynamic | 5 | 3276 | 16384 | 0 | 0 | 0 | 6 | 2026-06-20 08:56:35 | 2026-06-20 08:56:59 | NULL | utf8mb4_0900_ai_ci | NULL | | |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
InnoDBの特徴
InnoDBには以下の特徴があります。
- トランザクションを扱える
- コミット、ロールバック、クラッシュリカバリーの機能がある
- 行レベルロックを使う
- 外部キー制約をサポートしている
- 主キーに基づいてデータが配置される
トランザクションとクラッシュリカバリーによって、サーバーが突然停止した場合でも中途半端な状態のデータが保存されることがなくデータが壊れにくいという利点があります。
また、ロックの単位が行レベルであるため、複数の書き込みが同時に行われても互いの処理を妨げにくいです。
他エンジンとの比較
MySQLには、InnoDB以外にも複数のストレージエンジンがあり、それぞれ異なるユースケースで使用されることを想定して設計されています。
| ストレージエンジン | 主な特徴 | トランザクション | ロック粒度 | 用途のイメージ |
|---|---|---|---|---|
| InnoDB | MySQL5.5以降のデフォルト。トランザクション、外部キー、クラッシュリカバリーをサポートする | あり | 行 | 通常のWebアプリケーションで使う基本の選択肢 |
| MyISAM | 旧デフォルト。フットプリントが小さい。読み取り中心のワークロードで使われることがある | なし | テーブル | 読み取り中心の用途 |
| MEMORY | データをメモリ上に保持する | なし | テーブル | 一時的な作業用データや高速な参照 |
| CSV | CSV形式のテキストファイルとしてデータを扱う | なし | テーブル | CSV形式でのインポート・エクスポート |
| ARCHIVE | 大量の履歴データや監査情報をコンパクトに保存する用途 | なし | 行 | あまり更新しない大量データの保存 |
| BLACKHOLE | 書き込まれたデータを保存しない。問い合わせ結果は常に空になる | なし | なし | レプリケーション構成などで、データを保存せずにDMLだけ扱いたい場合 |
| NDB / NDBCLUSTER | クラスタデータベースエンジン。高いアップタイムと可用性を必要とする用途向け | あり | 行 | MySQL NDB Clusterで使う分散データベース用途 |
| MERGE / MRG_MYISAM | 同じ構造のMyISAMテーブルをまとめて1つのテーブルのように扱う | なし | テーブル | データウェアハウスなど、同じ構造の大きなテーブル群を扱う用途 |
| FEDERATED | リモートのMySQLサーバー上にあるテーブルへアクセスする | なし | なし | 別サーバーのデータをローカルテーブルのように参照したい場合 |
| EXAMPLE | 新しいストレージエンジンを作るためのサンプル実装。データの保存や取得はできない | なし | なし | 開発者向けのサンプル |
| PERFORMANCE_SCHEMA | MySQLサーバー内部の実行状況を確認する performance_schema 用のエンジン |
なし | なし | パフォーマンス計測や監視用 |
利用できるストレージエンジンはMySQLのバージョンなど環境によって異なります。
実際に利用できるストレージエンジンは、以下のSQLで確認できます。
SHOW ENGINES;
表示例:
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster | NO | Clustered, fault-tolerant tables | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| ndbinfo | NO | MySQL Cluster system information storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
まとめ
-
ENGINE=InnoDBは、「このテーブルではInnoDBというストレージエンジンを使用する」という意味 - ストレージエンジンは、テーブルのデータの保存・読み書きの方法などに関わる部分
- InnoDBはMySQLのデフォルトのストレージエンジンである
最後までお読みいただきありがとうございました。