「MySQL - ストレージエンジン」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == ストレージエンジンとは、RDBMSにおいてデータやトランザクションの管理を行う機能のことである。<br> MySQLでは、テーブルごとにストレージエンジンを指定することができる。<br> <br> * データフォーマットの定義 * データ永続化 * インデックス管理 * トランザクション管理 * ロックおよび排他的制御 <br> <center> {| class="wikitable" | style="background…」)
 
69行目: 69行目:
  ALTER TABLE sample_table ENGINE = 'MEMORY';
  ALTER TABLE sample_table ENGINE = 'MEMORY';
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
== InnoDB ==
==== InnoDBのデータファイル ====
システム変数<code>innodb_file_per_table</code>により、テーブルごとにデータファイルを作成するかどうかを設定することができる。<br>
テーブルごとにファイルを作成することにより、テーブルの<code>DROP</code>文、<code>TRUNCATE</code>文等の実行時において、ディスク使用量を減らすことができる。<br>
<syntaxhighlight lang="mysql">
SHOW VARIABLES LIKE 'innodb_file_per_table';
</syntaxhighlight>
<br>
システム変数<code>innodb_file_per_table</code>が<code>ON</code>の場合、データディレクトリ配下にテーブルごとの***.indファイルが作成される。<br>
なお、デフォルトのデータディレクトリは/var/lib/mysql/mysqlディレクトリである。<br>
<br>
==== InnoDBのトランザクションログ ====
データの更新は、以下に示すような流れで処理される。<br>
# トランザクションの実行直後に、InnoDBログバッファ (メモリ上の領域) に書き込む。
# コミット時に、InnoDBログファイル(WAL : Write Ahead Log)、および、バッファプール (メモリ上のキャッシュ) にログバッファの内容を書き込む。
# 任意のタイミングでバッファプールの内容をデータファイルへ反映する。
<br>
バッファプールの内容をデータファイルに反映する前にデータが消えた場合等に、InnoDBログファイルがリカバリに利用される。<br>
<br>
==== ログファイルの設定 ====
<syntaxhighlight lang="mysql">
SHOW VARIABLES LIKE 'innodb_log%';
</syntaxhighlight>
<br>
* innodb_log_buffer_size
*: ログファイルの書き込み時において、InnoDBで使用されるバッファのサイズ。
* innodb_log_checksums
*: <br>
* innodb_log_compressed_pages
*: <br>
* innodb_log_file_size
*: ログファイルのサイズ。
* innodb_log_files_in_group
*: ログファイルの数。
* innodb_log_group_home_dir
*: ログファイルのディレクトリパス。
* innodb_log_write_ahead_size
*: Read on Write問題に関するオプション
<br>
ディスクのブロックサイズよりも小さなデータをログファイルの途中に書き込む時、<br>
対象ブロックの読み取り後に書き戻すという非効率な処理を避けるため、ブロックサイズ分のみデータを補完して書き込みのみ行われるようにした。<br>
<br>
==== バッファプールの設定 ====
<syntaxhighlight lang="mysql">
SHOW VARIABLES LIKE 'innodb_buffer%';
</syntaxhighlight>
<br>
* innodb_buffer_pool_chunk_size
*: <br>
* innodb_buffer_pool_dump_at_shutdown
*: MySQLのシャットダウン時にバッファプールにキャッシュされるページを記録するかどうか。
* innodb_buffer_pool_dump_now
*: <br>
* innodb_buffer_pool_dump_pct
*: <br>
* innodb_buffer_pool_filename
*: バッファプールのキャッシュを記録する場合のファイル名。
* innodb_buffer_pool_instances
*: <br>
* innodb_buffer_pool_load_abort
*: <br>
* innodb_buffer_pool_load_at_startup
*: 記録したバッファプールの内容をロードするかどうか。
* innodb_buffer_pool_load_now
*: <br>
* innodb_buffer_pool_size
*: バッファプールのサイズ
<br><br>
<br><br>



2024年1月14日 (日) 12:09時点における版

概要

ストレージエンジンとは、RDBMSにおいてデータやトランザクションの管理を行う機能のことである。
MySQLでは、テーブルごとにストレージエンジンを指定することができる。

  • データフォーマットの定義
  • データ永続化
  • インデックス管理
  • トランザクション管理
  • ロックおよび排他的制御


主なストレージエンジン
ストレージエンジン 意味
InnoDB デフォルトのストレージエンジン。
行ロック、トランザクション、クラッシュリカバリ等に対応している。
MyISAM 古いMySQLのデフォルトのストレージエンジン。
テーブルレベルのロックに対応している。
MEMORY メモリ上にテーブルを配置する。
アクセス頻度の高いデータ向け。
Archive データを自動的に圧縮する。
データの追加、参照のみ行うことができる。
主に、ログや監査向けで使用する。
NDB MySQL Cluster構成にて使用される。
CSV CSV形式でデータを保存および使用する。
Blackhole /dev/nullのように書き込んだデータを破棄する。



ストレージエンジンの操作

利用可能なストレージエンジンの確認

 SHOW ENGINES;


ストレージエンジンを指定してテーブルの作成

 USE <データベース名>;
 
 CREATE TABLE <テーブル名> (
    <カラム名 1> <型名>
    <カラム名 2> <型名>
    <カラム名 3> <型名>
    -- ...略
 )
 ENGINE = <ストレージエンジン名>;


既存テーブルのストレージエンジン確認

 USE <データベース名>;
 
 SHOW TABLE STATUS
    where name = '<テーブル名>' \G;


既存テーブルのストレージエンジンの変更

 USE <データベース名>;
 
 ALTER TABLE <テーブル名> ENGINE = '<ストレージエンジン名>';
 
 -- 例: sample_tableテーブルのストレージエンジンをMEMORYに変更する
 ALTER TABLE sample_table ENGINE = 'MEMORY';



InnoDB

InnoDBのデータファイル

システム変数innodb_file_per_tableにより、テーブルごとにデータファイルを作成するかどうかを設定することができる。
テーブルごとにファイルを作成することにより、テーブルのDROP文、TRUNCATE文等の実行時において、ディスク使用量を減らすことができる。

 SHOW VARIABLES LIKE 'innodb_file_per_table';


システム変数innodb_file_per_tableONの場合、データディレクトリ配下にテーブルごとの***.indファイルが作成される。
なお、デフォルトのデータディレクトリは/var/lib/mysql/mysqlディレクトリである。

InnoDBのトランザクションログ

データの更新は、以下に示すような流れで処理される。

  1. トランザクションの実行直後に、InnoDBログバッファ (メモリ上の領域) に書き込む。
  2. コミット時に、InnoDBログファイル(WAL : Write Ahead Log)、および、バッファプール (メモリ上のキャッシュ) にログバッファの内容を書き込む。
  3. 任意のタイミングでバッファプールの内容をデータファイルへ反映する。


バッファプールの内容をデータファイルに反映する前にデータが消えた場合等に、InnoDBログファイルがリカバリに利用される。

ログファイルの設定

 SHOW VARIABLES LIKE 'innodb_log%';


  • innodb_log_buffer_size
    ログファイルの書き込み時において、InnoDBで使用されるバッファのサイズ。
  • innodb_log_checksums

  • innodb_log_compressed_pages

  • innodb_log_file_size
    ログファイルのサイズ。
  • innodb_log_files_in_group
    ログファイルの数。
  • innodb_log_group_home_dir
    ログファイルのディレクトリパス。
  • innodb_log_write_ahead_size
    Read on Write問題に関するオプション


ディスクのブロックサイズよりも小さなデータをログファイルの途中に書き込む時、
対象ブロックの読み取り後に書き戻すという非効率な処理を避けるため、ブロックサイズ分のみデータを補完して書き込みのみ行われるようにした。

バッファプールの設定

 SHOW VARIABLES LIKE 'innodb_buffer%';


  • innodb_buffer_pool_chunk_size

  • innodb_buffer_pool_dump_at_shutdown
    MySQLのシャットダウン時にバッファプールにキャッシュされるページを記録するかどうか。
  • innodb_buffer_pool_dump_now

  • innodb_buffer_pool_dump_pct

  • innodb_buffer_pool_filename
    バッファプールのキャッシュを記録する場合のファイル名。
  • innodb_buffer_pool_instances

  • innodb_buffer_pool_load_abort

  • innodb_buffer_pool_load_at_startup
    記録したバッファプールの内容をロードするかどうか。
  • innodb_buffer_pool_load_now

  • innodb_buffer_pool_size
    バッファプールのサイズ