デフォルトでは、MySQL はセッションごとに専用のスレッドを 1 つ作成します。高い同時実行性の環境下では、これによりスレッドスケジューリングのオーバーヘッドが過剰に増加し、キャッシュの無効化が頻発するため、パフォーマンスが低下します。スレッドプール機能は、スレッドとセッションの結合を解除し、複数のセッションが少数のスレッドプールを共有することで、スケジューリングのオーバーヘッドを低減し、キャッシュヒット率を高めます。この機能は、短時間で CPU バウンドなクエリを実行する OLTP ワークロードおよび多数の同時接続が発生する環境で最も効果を発揮します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
MySQL 5.6、5.7、または 8.0 を実行している ApsaraDB RDS for MySQL インスタンス
仕組み
スレッドプールは、「1 セッション 1 スレッド」というボトルネックを、以下の 2 つのメカニズムで解消します。
優先度ベースのスケジューリング:データ管理用の SQL ステートメント(接続の確立、モニタリング、管理コマンドなど)には高い優先度が割り当てられ、優先度の低いクエリより先に実行されます。サブクエリ、集計関数、または GROUP BY 句および LIMIT 句を含む複雑なクエリには低い優先度が割り当てられ、他のワークロードがリソース不足になることを防ぎます。
同時実行制御:スレッドはグループ単位に分割されます。各グループは同時にアクティブなスレッド数の上限を設定しており、スケジューリングのオーバーヘッドを管理可能な範囲内に抑え、キャッシュの有効性を維持します。
これらのメカニズムを組み合わせることで、同時接続数が急増してもデータベースを安定して運用できます。
スレッドプールの設定
スレッドプールのパラメーターは、ApsaraDB for RDS コンソールから設定します。詳細については、「ApsaraDB RDS for MySQL インスタンスのパラメーターの変更」をご参照ください。
| パラメーター | デフォルト値 | 説明 |
|---|---|---|
thread_pool_enabled | ON | スレッドプールの有効/無効を設定します。有効な値は ON および OFF です。thread_handling パラメーターは非推奨であり、効果がありません。このパラメーターの有効/無効切り替えには、インスタンスの再起動は不要です。 |
thread_pool_size | 4 | スレッドグループの数です。スレッドプール内のスレッドは均等にグループ分けされ、グループ単位で管理されます。 |
thread_pool_oversubscribe | 32 | グループあたりのアクティブスレッドの最大数です。SQL ステートメントを実行中のスレッドがアクティブとみなされます。ディスク I/O やトランザクションコミットを待機中のスレッドは非アクティブとみなされ、この上限には含まれません。 |
スレッドプールの監視
現在のスレッドプールの状態を確認するには、以下のコマンドを実行します。
SHOW STATUS LIKE 'thread_pool%';実行例:
mysql> SHOW STATUS LIKE 'thread_pool%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| thread_pool_active_threads | 1 |
| thread_pool_big_threads | 0 |
| thread_pool_dml_threads | 0 |
| thread_pool_idle_threads | 19 |
| thread_pool_qry_threads | 0 |
| thread_pool_total_threads | 20 |
| thread_pool_trx_threads | 0 |
| thread_pool_wait_threads | 0 |
+----------------------------+-------+
8 rows in set (0.00 sec)| ステータス変数 | 説明 |
|---|---|
thread_pool_active_threads | 現在 SQL ステートメントを実行中のスレッド数です。 |
thread_pool_big_threads | サブクエリ、集計関数、または GROUP BY 句および LIMIT 句を含む複雑な SQL ステートメントを実行中のスレッド。 |
thread_pool_dml_threads | データ操作言語 (DML) 文を実行しているスレッド。 |
thread_pool_idle_threads | 作業が割り当てられていないスレッド。 |
thread_pool_qry_threads | シンプルな SQL ステートメントを実行しているスレッド。 |
thread_pool_total_threads | スレッドプール内のスレッド総数です。 |
thread_pool_trx_threads | トランザクションを実行中のスレッド数です。 |
thread_pool_wait_threads | ディスク I/O またはトランザクションコミットを待機中のスレッド数です。 |
パフォーマンスベンチマーク
以下の SysBench テスト結果は、複数の同時セッション数における、スレッドプール有効時と無効時のスループットを比較したものです。同時セッション数が増加するにつれて、スレッドプールを有効にした場合のスループットは一貫して向上します。




