InnoDB
は、オペレーティングシステムスレッドを使用して、ユーザートランザクションからの要求を処理します。(トランザクションは、コミットまたはロールバックする前に、InnoDB
に多数の要求を発行する可能性があります。)コンテキストスイッチングが効率的な、マルチコアプロセッサを備えた最新のオペレーティングシステムおよびサーバーでは、並列スレッドの数を制限することなく、ほとんどのワークロードが適切に動作します。MySQL 5.5 以降でのスケーラビリティーの向上によって、InnoDB
の内部の並列実行中のスレッドの数を制限する必要性は低下します。
スレッド間のコンテキストスイッチングを最小限に抑えることが役立つ状況では、InnoDB
はいくつかの手法を使用して、並列実行中のオペレーティングシステムスレッドの数 (したがって、一度に処理される要求の数) を制限できます。InnoDB
がユーザーセッションからの新しい要求を受信したとき、並列実行中のスレッドの数が事前に定義された制限に達している場合、その新しい要求は再試行の前に短時間だけスリープします。スリープのあとに再スケジュールできない要求は先入れ先出しキューに入れられ、最終的に処理されます。ロックを待機しているスレッドは、並列実行中のスレッドの数にカウントされません。
並列スレッドの数は、構成パラメータ innodb_thread_concurrency
を設定することによって制限できます。実行中のスレッドの数がこの制限に達すると、追加のスレッドはキューに入れられる前に、構成パラメータ innodb_thread_sleep_delay
で設定されたマイクロ秒数だけスリープします。
以前は、innodb_thread_sleep_delay
の最適な値を見つけるには実験が必要であり、その最適な値もワークロードによって変化する可能性がありました。MySQL 5.6.3 以降では、構成オプション 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、5.6.6 より前は 500) で指定されます。ロックを待機しているスレッドには、そのロックが使用可能になるとチケットが 1 つ与えられます。
これらの変数の正しい値は、環境やワークロードによって異なります。アプリケーションでどのような値が機能するかを確認するには、さまざまな値を試してください。並列実行中のスレッドの数を制限する前に、マルチコアおよびマルチプロセッサコンピュータ上の InnoDB
のパフォーマンスを向上させる可能性のある構成オプション (innodb_adaptive_hash_index
など) を確認してください。
MySQL のスレッド処理に関する一般的なパフォーマンス情報については、セクション8.11.5.1「MySQL のクライアント接続のためのスレッドの使用方法」を参照してください。