2
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のストレージエンジンについて簡単にまとめてみた

Last updated at Posted at 2024-09-18

0. はじめに

1. MySQLのストレージエンジンについて

そもそもストレージエンジンとは?

  • テーブルにデータを追加したり、変更したり、削除したり、検索したり・・・
    • データベースに対して行う具体的な動作は、ストレージエンジンというプログラムが担当している
    • データの保存・処理のやり方を決める裏方の仕組み
  • ストレージエンジンにはいくつかの種類があり、それぞれ得意なことや特徴が異なる(得意・不得意がある!)
    • ストレージエンジン毎にそれぞれが異なるデータの保存方法やインデックス構造を持っている
  • テーブル単位でストレージエンジンを選択できる
  • MySQL公式サイトには以下のように記載されている(引用:https://dev.mysql.com/doc/refman/8.0/ja/storage-engines.html)
    • さまざまなテーブル型に対する SQL 操作を処理する MySQL コンポーネント

ストレージエンジンの種類を見てみる

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.4.0     |
+-----------+
1 row in set (0.00 sec)
             
mysql> 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         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.01 sec)
  • たくさんある(11種類)
    • たくさんあるので、本記事では全部の説明は割愛
    • MySQLの公式ドキュメントが詳しい:https://dev.mysql.com/doc/refman/8.0/ja/storage-engines.html
    • その中でも代表的なものとしてはデフォルトストレージエンジンであるInnoDBの使用が推奨される

2. InnoDBとは

  • MySQL 5.5以降のバージョンにおけるデフォルトのストレージエンジンであるInnoDBについて詳しく見ていく
    • Aurora MySQLの場合はInnoDBエンジンのみをサポートしている

InnoDBのアーキテクチャ

img.png

InnoDBのメモリ内構造

バッファプール(Buffer Pool)
  • データとインデックスのキャッシュを格納するメモリ領域
  • バッファプールを使用すると、頻繁に使用されるデータをメモリーから直接処理できるため、処理速度が向上する
  • 専用サーバーでは、多くの場合、最大 80% の物理メモリーがバッファプールに割り当てられる

参照:https://dev.mysql.com/doc/refman/8.0/ja/innodb-buffer-pool.html

チェンジバッファ(Change Buffer)
  • secondary indexページが buffer poolにない場合、そのページに対する変更をキャッシュする特別なデータ構造
  • チェンジバッファは、データの挿入、更新、削除操作を遅延して実行するために使用される
  • これにより、ディスク I/O を削減し、データの挿入、更新、削除のパフォーマンスを向上させる
  • ディスクI/Oを削減するために変更をキャッシュして後でディスクに適用する仕組み

参照:https://dev.mysql.com/doc/refman/8.0/ja/innodb-change-buffer.html

出典:15.5.2 変更バッファ

img_1.png

ログバッファ(Log Buffer)
  • トランザクションのログレコード(更新履歴)を一時的に保存するためのメモリ領域
  • ログバッファサイズは、innodb_log_buffer_size 変数によって定義
  • トランザクションがコミットされると、ログバッファの内容がログファイルに書き込まれる
  • ログバッファの内容は定期的にディスクにフラッシュされる、デフォルトのサイズは 16M バイト

InnoDBのストレージ構造

システムテーブルスペース(System Tablespace)
  • 変更バッファの記憶域、ibdata1という名前のファイルとして格納される
  • データディクショナリ:データベース内のテーブル、インデックス、外部キーなどのメタデータや、バッファプールにないセカンダリインデックスの変更を格納する
テーブルスペース(Tablespaces)
  • データファイル(テーブル名.ibd)とインデックスファイルを格納する
  • 実データ、インデックスが保存される
  • デフォルトはテーブル毎に.ibdファイルが作成される
一時テーブルスペース(Temporary Tablespaces)
  • セッションやグローバルスコープで使用される一時テーブルを格納する
  • クエリの実行中に必要な一時データを格納し、クエリの完了後に破棄される
Redoログファイル(Redo Log Files)
  • トランザクションのログレコード(更新履歴)を保存するためのファイル
  • トランザクションがコミットされると、Redoログファイルに書き込まれる
  • デフォルトでは、ib_logfile0ib_logfile1という名前のファイルが作成される
  • トランザクションの変更を永続化する前に記録し、クラッシュリカバリの際にデータを復元するために使用される

3. まとめ

  • MySQLにはいくつかのストレージエンジンがある
  • テーブル単位でストレージエンジンを選択できる
  • InnoDBはMySQL 5.5以降のバージョンにおけるデフォルトのストレージエンジン
  • Aurora MySQLの場合はInnoDBエンジンのみをサポートしている

参考記事

2
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
2
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?