0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【MySQL】"ENGINE=InnoDB"ってなんのこと?ストレージエンジンって何?

0
Posted at

はじめに

こんにちは。
業務で過去に作成された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ストレージエンジンを使用してデフォルトデータベースに作成されます。

出典: MySQL 8.0 リファレンスマニュアル - 13.1.20 CREATE TABLE ステートメント

テーブルのエンジンを確認する

既存のテーブルがどのストレージエンジンを使っているかは、以下の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のデフォルトのストレージエンジンである

最後までお読みいただきありがとうございました。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?