今日は、MySQL 8.4.0で変更されたInnoDB システム変数のデフォルト値を見ていくの日。
目次
- 目次
- とある日
- MySQL 8.4 の新機能
- innodb_buffer_pool_in_core_file
- innodb_buffer_pool_instances
- innodb_change_buffering
- innodb_dedicated_server
- innodb_adaptive_hash_index
- innodb_doublewrite_files
- innodb_doublewrite_pages
- innodb_flush_method
- innodb_io_capacity
- innodb_io_capacity_max
- innodb_log_buffer_size
- innodb_numa_interleave
- innodb_page_cleaners
- innodb_parallel_read_threads
- innodb_purge_threads
- innodb_read_io_threads
- innodb_use_fdatasync
- temptable_max_ram
- temptable_max_mmap
- temptable_use_mmap
- 〆
とある日
2024-04-30にMySQL 8.4がリリースされました。
MySQL :: MySQL 8.4 リリース ノート :: MySQL 8.4.0 の変更点 (2024-04-30、LTS リリース)
バージョンリリースの変更に伴って初のLTSの登場で、「MySQL 8.4 の新機能」というページが新しく生えてたので見ていこうかなと思います。
「MySQL 8.4 の新機能」の中でも、システム変数が色々と変わってたのでゆっくり見ていきます。
MySQLの Innovation と Long-Term Support (LTS) バージョンのご紹介
MySQL 8.4 の新機能
InnoDB システム変数のデフォルト値が変更されました。
InnoDB
次の表に示すように、ストレージ エンジン に関連するいくつかのサーバー システム変数のデフォルト値がMySQL 8.4.0 で変更されました。MySQL :: MySQL 8.4 リファレンスマニュアル :: 1.4 MySQL 8.0 以降の MySQL 8.4 の新機能
変更対象のシステム変数一覧
innodb_buffer_pool_in_core_file
innodb_buffer_pool_instances
innodb_change_buffering
innodb_dedicated_server
innodb_adaptive_hash_index
innodb_doublewrite_files
innodb_doublewrite_pages
innodb_flush_method
innodb_io_capacity
innodb_io_capacity_max
innodb_log_buffer_size
innodb_numa_interleave
innodb_page_cleaners
innodb_parallel_read_threads
innodb_purge_threads
innodb_read_io_threads
innodb_use_fdatasync
temptable_max_ram
temptable_max_mmap
temptable_use_mmap
意外と知らない変数ばかりだったので一つづつ見ていきます。
innodb_buffer_pool_in_core_file
- プログラム異常時に出力される「coreファイル」にバッファー プール ページを含めるかいなかを表す変数
変更点
調べたこと
- この変数を使用するには、
core_file
変数を有効にする必要がある - MADV_DONTDUMPは、OSのメモリ操作に関する指示?
- プログラム異常時に出力される「coreファイル」にバッファー プール ページを含めるかいなかを表す変数
- これを無効化するとcoreファイルのサイズが削減される
- サイズが大きくなれば時間やディスク量、転送時間で問題があるらしい
innodb_buffer_pool_instances
InnoDB
バッファプールが分割される 領域の数
変更点
- 新しいデフォルト値 (MySQL 8.4)
- 以前のデフォルト値 (MySQL 8.0)
- 8 (または
innodb_buffer_pool_size
1 GiB 未満の場合は 1)
- 8 (または
調べたこと
- 各バッファープールインスタンスが少なくとも 1GB になるようすると最高の効率になるらしい
innodb_change_buffering
- バッファリングするDMLを決定する
変更点
調べたこと
- 変更バッファ
- secondary index ページが buffer pool にない場合に、そのページに対する変更をキャッシュする特別なデータ構造
- 後で他の読取り操作によってページがバッファプールにロードされるときにマージされる
- MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.5.2 変更バッファ
- 変更バッファのマージでは、影響を受ける行と更新するセカンダリインデックスが多数ある場合、数時間かかることがある
- 変更バッファにキャッシュされるデータのタイプは、
innodb_change_buffering
変数によって制御される - 変更バッファリング
- I/O 操作を順次実行できるようにセカンダリ インデックスへの書き込み操作を遅らせる最適化
innodb_dedicated_server
- システム変数の自動設定
変更点
調べたこと
InnoDB
次の変数が自動的に設定されるinnodb_buffer_pool_size
innodb_redo_log_capacity
- REDO ログ ファイルが占有するディスク領域の量
- 利用可能なすべてのシステム リソースを使用できる専用サーバー上に存在する場合にのみ有効化を検討
innodb_adaptive_hash_index
- アダプティブハッシュインデックスが有効か無効か
変更点
調べたこと
- アダプティブハッシュインデックス=適応型ハッシュインデックス
- メモリ内に*ハッシュ インデックス*を構築することで、 and 演算子
InnoDB
を使用した検索を高速化できるテーブル の最適化 - MySQL :: MySQL 8.4 Reference Manual :: MySQL Glossary
- メモリ内に*ハッシュ インデックス*を構築することで、 and 演算子
- アダプティブ ハッシュ インデックスはすべてのワークロードに役立つとは限らない
- アダプティブハッシュインデックスを無効にすると、ハッシュ テーブルがすぐに空になる
innodb_doublewrite_files
- 二重書き込みファイルの数を定義
- バッファープールインスタンスごとに 2 つの二重書き込みファイルが作成
変更点
- 新しいデフォルト値 (MySQL 8.4): 2
- 以前のデフォルト値 (MySQL 8.0):
innodb_buffer_pool_instances
調べたこと
- 二重書き込みバッファ
- データ ファイル内の適切な位置にページを書き込む前に、バッファ プールからフラッシュされたページを書き込む ストレージ領域
innodb_doublewrite_pages
- バッチ書き込みのスレッドごとの二重書き込みページの最大数を定義
変更点
- 新しいデフォルト値 (MySQL 8.4):128
- 以前のデフォルト値 (MySQL 8.0):
innodb_write_io_threads
、これはデフォルトの 4 を意味します。
調べたこと
innodb_write_io_threads
InnoDB
の書き込み操作の I/O スレッドの数
innodb_flush_method
変更点
調べたこと
O_DIRECT
fsync
または0
: システム コールInnoDB
を使用してfsync()
、データ ファイルとログ ファイルの両方をフラッシュします。O_DIRECT
または4
:InnoDB
を使用してO_DIRECT
(またはdirectio()
Solaris では) データ ファイルを開き、 を使用してfsync()
データ ファイルとログ ファイルの両方をフラッシュします。このオプションは、一部の GNU/Linux バージョン、FreeBSD、および Solaris で利用できます。
innodb_io_capacity
- innodb_io_capacity 変数は、バッファ・プールからのページのフラッシュや変更バッファからのデータのマージなどの InnoDB バックグラウンド・タスクで利用可能な 1 秒あたりの I/O 操作数 (IOPS) を定義します。
変更点
調べたこと
innodb_io_capacity
変数は、InnoDB
で使用可能な全体的な I/O 容量を定義設定は可能な限り低くするのが理想的ですが、バックグラウンド アクティビティが遅れるほど低くしてはいけません。
- 値が高すぎると、バッファ プールからデータが削除され、バッファの変更が速すぎて、キャッシュによる大きなメリットが得られなくなります。
innodb_io_capacity_max
- フラッシング活動が遅れた場合、InnoDBは、innodb_io_capacity変数で定義されたよりも高いI/Oオペレーション/秒(IOPS)で、より積極的にフラッシュすることができます。
- innodb_io_capacity_max 変数は、このような状況で InnoDB バックグラウンドタスクが実行する IOPS の最大数を定義します。
- このオプションはinnodb_flush_syncの動作を制御しない。
- デフォルト値は、innodb_io_capacityの値の2倍です。
変更点
- 新しいデフォルト値 (MySQL 8.4):2 *
innodb_io_capacity
- 以前のデフォルト値 (MySQL 8.0):2 *
innodb_io_capacity
, with a minimum default value of 2000
innodb_log_buffer_size
- InnoDB がディスク上のログ ファイルに書き込むために使用するバッファのバイト サイズ。
- デフォルトは64MBです。
- 大きなログバッファを使用すると、トランザクションがコミットする前にディスクにログを書き込む必要なく、大きなトランザクションを実行することができます。
- したがって、多くの行を更新、挿入、削除するトランザクションがある場合、ログバッファを大きくすることでディスクI/Oを節約することができます。
- 関連情報については、メモリ構成、および項10.5.4. 「InnoDB Redo Loggingの最適化」を参照してください。一般的なI/Oチューニングのアドバイスについては、項10.5.8. 「InnoDBディスクI/Oの最適化」を参照してください。
変更点
innodb_numa_interleave
- InnoDB バッファプールの割り当てのための NUMA インターリーブメモリポリシーを有効にします。
- innodb_numa_interleave が有効になると、NUMA メモリ・ポリシーが mysqld プロセスの MPOL_INTERLEAVE に設定されます。
- InnoDB バッファ・プールが割り当てられた後、NUMA メモリ・ポリシーは MPOL_DEFAULT に戻されます。
- innodb_numa_interleave オプションを使用するには、MySQL を NUMA 対応 Linux システムでコンパイルする必要があります。
- デフォルト値は、システムがサポートしていれば ON、そうでなければ OFF です。
変更点
調べたこと
- NUMA (Non-Uniform Memory Access)
- マルチプロセッサー構成の「サーバーアーキテクチャー」の一つです。
- NUMAには、日本語で「共有メモリー型マルチプロセッシング」という意味があります。
- 【NTT西日本】NUMA|ICT用語集|法人・ 企業向け ICT サービス ・ ソリューション
innodb_page_cleaners
- バッファプールインスタンスからダーティページをフラッシュするページクリーナースレッドの数。
- ページクリーナースレッドはフラッシュリストとLRUフラッシュを実行する。
- 複数のページクリーナースレッドがある場合、各バッファプールインスタンスのバッファプールフラッシングタスクはアイドル状態のページクリーナースレッドにディスパッチされます。
- innodb_page_cleaners のデフォルト値は innodb_buffer_pool_instances と同じ値に設定されています。
- 指定されたページクリーナースレッドの数がバッファプールインスタンスの数を超える場合、 innodb_page_cleaners は自動的にinnodb_buffer_pool_instances と同じ値に設定されます。
- バッファプールインスタンスからデータファイルへダーティページをフラッシュする際に、ワークロードがライトIOバインドされ、システムハードウェアに利用可能な容量がある場合、ページクリーナースレッドの数を増やすと、ライトIOスループットの改善に役立つかもしれません。
- マルチスレッド・ページ・クリーナーのサポートは、シャットダウンおよびリカバリ・フェーズにまで拡張されます。
- setpriority()システムコールは、それがサポートされ、mysqld実行ユーザが他のMySQLスレッドやInnoDBスレッドよりもpage_cleanerスレッドに優先順位を与えることを許可されているLinuxプラットフォームで使用され、ページフラッシングが現在のワークロードに追いつくのを助けます。
変更点
- 新しいデフォルト値 (MySQL 8.4):
innodb_buffer_pool_instances
- 以前のデフォルト値 (MySQL 8.0):4
調べたこと
- ダーティページは、変更されたが、まだディスク上のデータファイルに書き込まれていないページです。
- MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.8.3.5 バッファープールのフラッシュの構成
innodb_parallel_read_threads
- クラスタ化されたインデックスの並列読み取りに使用できるスレッド数を定義します。
- パーティションの並列スキャンもサポートされます。
- 並列読み取りスレッドはCHECK TABLEのパフォーマンスを向上させます。
- InnoDBは、CHECK TABLE操作中にクラスタ化インデックスを2回読み取ります。
- 2回目の読み取りは並列で実行することができます。
- この機能はセカンダリインデックススキャンには適用されません。
- 並列クラスタ化インデックス読み取りを行うには、innodb_parallel_read_threadsセッション変数を1より大きい値に設定しなければなりません。
- 並列クラスタ化インデックス読み取りを実行するために使用される実際のスレッド数は、innodb_parallel_read_threads設定か、スキャンするインデックスサブツリーの数のどちらか小さい方で決まります。
- スキャン中にバッファプールに読み込まれたページは、バッファプールLRUリストの末尾に保持され、空きバッファプールページが必要になった時に素早く破棄できるようにします。
- 並列読み取りスレッドの最大数(256)は、すべてのクライアント接続のスレッド数の合計である。
- スレッドの上限に達した場合、接続はシングルスレッドの使用にフォールバックする。
- デフォルト値は、システムで使用可能な論理プロセッサの数を 8 で割った値で計算され、デフォルトの最小値は 4 です。
- MySQL 8.4 以前では、デフォルト値は常に 4 でした。
変更点
- 新しいデフォルト値 (MySQL 8.4):available logical processors / 8, with a minimum default value of 4
- 以前のデフォルト値 (MySQL 8.0):4
innodb_purge_threads
変更点
- 新しいデフォルト値 (MySQL 8.4):1 if available logical processors is <= 16, otherwise 4
- 以前のデフォルト値 (MySQL 8.0):4
調べたこと
パージ
1 つ以上のパージ スレッドによってバックグラウンドで実行されます。
- MySQL :: MySQL 8.4 リファレンスマニュアル :: 17.8.9 パージ設定
innodb_read_io_threads
- InnoDB の読み取り操作のための I/O スレッド数。
- 書き込みスレッドに対する対応は innodb_write_io_threads です。
- デフォルト値は、システムで利用可能な論理プロセッサ数を 2 で割った値で、最小デフォルト値は 4 です。
- MySQL 8.4 以前では、デフォルト値は常に 4 でした。
変更点
- 新しいデフォルト値 (MySQL 8.4):available logical processors / 2, with a minimum default value of 4
- 以前のデフォルト値 (MySQL 8.0):4
調べたこと
- これらの構成オプションの目的は、
InnoDB
ハイエンド システムでよりスケーラブルにすることです。 - MySQL :: MySQL 8.4 リファレンスマニュアル :: 17.8.5 バックグラウンド InnoDB I/O スレッド数の設定
innodb_use_fdatasync
- fdatasync()システムコールをサポートしているプラットフォームでは、 innodb_use_fdatasync を有効にすると、オペレーティングシステムのフラッシュに fsync()システムコールの代わりに fdatasync()を使うことができます。
- fdatasync() 呼び出しは、その後のデータ検索に必要でない限り、ファイルメタデータの変更をフラッシュしないので、潜在的なパフォーマンス上の利点があります。
- fsync、O_DSYNC、O_DIRECT などの innodb_flush_method 設定のサブセットは fsync() システムコールを使用します。innodb_use_fdatasync 変数はこれらの設定を使用する時に適用されます。
- MySQL 8.4 以前では、このオプションはデフォルトで無効になっていました。
変更点
調べたこと
- fdatasync() は (システム・コールから戻る前に) ファイルの全てのデータ・バッファーを ディスクにフラッシュ (flush) する。これは fsync() に似ているが、アクセス時刻のようなメタデータを更新しない。
temptable_max_ram
- TempTable ストレージ エンジンがディスクへのデータ保存を開始するまでに占有できるメモリの最大量を定義します。
- デフォルト値はサーバで使用可能な総メモリの 3% で、デフォルトの最小および最大範囲は 1-4 GiB です。
- MySQL 8.4 以前では、デフォルト値は常に 1 GiB でした。
変更点
- 新しいデフォルト値 (MySQL 8.4): 3% of total memory, with a default value within a range of 1-4 GiB
- 以前のデフォルト値 (MySQL 8.0):1073741824 (1 GiB)
調べたこと
- 場合によっては、サーバーはステートメントの処理中に内部一時テーブルを作成します。ユーザーは、これがいつ発生するかを直接制御することはできません。
- MySQL :: MySQL 8.4 リファレンスマニュアル :: 10.4.4 MySQL での内部一時テーブルの使用
temptable_max_mmap
- TempTable ストレージ エンジンがディスク上の InnoDB 内部テンポラリ テーブルへのデータ格納を開始する前に、メモリ マップされたテンポラリ ファイルから割り当てることを許可されるメモリの最大量 (バイト単位) を定義します。
- 0 の設定(デフォルト)は、メモリ マップされた一時ファイルからのメモリの割り当てを無効にします。
- MySQL 8.4 以前では、このオプションは 0 ではなく 1 GiB に設定されていました。
変更点
調べたこと
TempTable
ストレージエンジンは、VARCHAR
およびVARBINARY
カラム、および MySQL 8.0.13 の時点でのその他のバイナリラージオブジェクト型の効率的なストレージを提供します。
temptable_use_mmap
- TempTable ストレージ エンジンが占有するメモリ量が temptable_max_ram 変数で定義された制限を超えた場合、メモリ マップされたテンポラリ ファイルとして内部メモリ内テンポラリ テーブルの領域を割り当てるかどうかを定義します。
- temptable_use_mmapが無効な場合(デフォルト)、TempTableストレージエンジンは、代わりにInnoDBオンディスク内部テンポラリテーブルを使用します。
変更点
〆
知らない変数ばかりだなってなりました。