InnoDB
は、オペレーティングシステムスレッドを使用して、ユーザートランザクションからの要求を処理します。 (トランザクションは、コミットまたはロールバックする前に、InnoDB
に多数の要求を発行する可能性があります。) コンテキストスイッチングが効率的な、マルチコアプロセッサを備えた最新のオペレーティングシステムおよびサーバーでは、並列スレッドの数を制限することなく、ほとんどのワークロードが適切に動作します。
スレッド間のコンテキストスイッチングを最小限に抑えることが役立つ状況では、InnoDB
はいくつかの手法を使用して、並列実行中のオペレーティングシステムスレッドの数 (したがって、一度に処理される要求の数) を制限できます。 InnoDB
がユーザーセッションからの新しい要求を受信したとき、並列実行中のスレッドの数が事前に定義された制限に達している場合、その新しい要求は再試行の前に短時間だけスリープします。 スリープのあとに再スケジュールできない要求は先入れ先出しキューに入れられ、最終的に処理されます。 ロックを待機しているスレッドは、並列実行中のスレッドの数にカウントされません。
並列スレッドの数は、構成パラメータ innodb_thread_concurrency
を設定することによって制限できます。 実行中のスレッドの数がこの制限に達すると、追加のスレッドはキューに入れられる前に、構成パラメータ innodb_thread_sleep_delay
で設定されたマイクロ秒数だけスリープします。
構成オプション innodb_adaptive_max_sleep_delay
を innodb_thread_sleep_delay
に許可する最大値に設定すると、InnoDB
は現在のスレッドスケジュールアクティビティに応じて innodb_thread_sleep_delay
を自動的に上下に調整します。 この動的な調整は、システムにかかる負荷が軽い期間や、システムがほぼ容量いっぱいで動作している期間に、スレッドスケジューリングメカニズムがスムーズに機能するのに役立ちます。
innodb_thread_concurrency
のデフォルト値や、並列スレッドの数に対する暗黙的なデフォルトの制限は、MySQL および InnoDB
のさまざまなリリースで変更されてきました。 innodb_thread_concurrency
のデフォルト値は 0
であるため、デフォルトでは同時に実行するスレッドの数に制限はありません。
InnoDB
では、同時スレッド数が制限されている場合にのみスレッドがスリープします。 スレッドの数に対して制限がない場合は、すべてが均等に競合してスケジュールされます。 つまり、innodb_thread_concurrency
が 0
である場合は、innodb_thread_sleep_delay
の値は無視されます。
スレッドの数に対して制限がある (innodb_thread_concurrency
> 0 である) 場合、InnoDB
は、1 つの SQL ステートメントの実行中に発行された複数の要求が innodb_thread_concurrency
で設定された制限に従うことなく InnoDB
に入ることを許可することによって、コンテキストスイッチングのオーバーヘッドを削減します。 SQL ステートメント (結合など) は InnoDB
内の複数の行操作で構成されている可能性があるため、InnoDB
は、スレッドが最小限のオーバーヘッドで繰り返しスケジュールされることを許可する指定された数の「チケット」を割り当てます。
新しい SQL ステートメントが開始されたとき、スレッドにはチケットがないため、innodb_thread_concurrency
に従う必要があります。 スレッドが InnoDB
に入ることを許可されると、そのスレッドには、行操作を実行するためにあとで InnoDB
に入るときに使用できる複数のチケットが割り当てられます。 それらのチケットが使い果たされた場合、スレッドは削除され、ふたたび innodb_thread_concurrency
に従います。それにより、そのスレッドが、待機中のスレッドの先入れ先出しキューに戻される可能性があります。 スレッドがふたたび InnoDB
に入ることを許可されると、チケットが再度割り当てられます。 割り当てられるチケットの数は、グローバルオプション innodb_concurrency_tickets
(デフォルトは 5000) によって指定されます。 ロックを待機しているスレッドには、そのロックが使用可能になるとチケットが 1 つ与えられます。
これらの変数の正しい値は、環境やワークロードによって異なります。 アプリケーションでどのような値が機能するかを確認するには、さまざまな値を試してください。 並列実行中のスレッドの数を制限する前に、マルチコアおよびマルチプロセッサコンピュータ上の InnoDB
のパフォーマンスを向上させる可能性のある構成オプション (innodb_adaptive_hash_index
など) を確認してください。
MySQL のスレッド処理に関する一般的なパフォーマンス情報については、セクション5.1.12.1「接続インタフェース」を参照してください。