幸いなことに、それは通常それを意味するものではありません。
方程式に欠けている変数は、データベースがどのようにおよび アプリケーションサーバーおよび スタック内の他のすべてのものは、同時実行 を処理します 。
これをMySQLの観点から厳密に説明するために、MySQLサーバーへの固定数の接続をそれぞれ独自のスレッドで確立する(したがって、サーバーにほぼ同時にクエリを発行できる)テストクライアントプログラムを作成しました。 。
すべてのスレッドが接続されていることを通知すると、メッセージがすべてのスレッドに同時に送信され、クエリが送信されます。
各スレッドが「go」信号を受け取ると、現在のシステム時刻を調べて、クエリをサーバーに送信します。応答を受け取ると、システム時刻を再度確認し、すべての情報をメインスレッドに送り返します。メインスレッドは、タイミングを比較して、以下の出力を生成します。
プログラムは、サーバーへの接続を確立するために必要な時間をカウントしないように作成されています。これは、正常に動作するアプリケーションでは接続が再利用可能であるためです。
クエリはSELECT SQL_NO_CACHE COUNT(1) FROM ...
でした (約500行のInnoDBテーブル)。
threads 1 min 0.001089 max 0.001089 avg 0.001089 total runtime 0.001089
threads 2 min 0.001200 max 0.002951 avg 0.002076 total runtime 0.003106
threads 4 min 0.000987 max 0.001432 avg 0.001176 total runtime 0.001677
threads 8 min 0.001110 max 0.002789 avg 0.001894 total runtime 0.003796
threads 16 min 0.001222 max 0.005142 avg 0.002707 total runtime 0.005591
threads 32 min 0.001187 max 0.010924 avg 0.003786 total runtime 0.014812
threads 64 min 0.001209 max 0.014941 avg 0.005586 total runtime 0.019841
時間は秒単位です。 min / max / avgは、同じクエリを実行して観察された最良/最悪/平均時間です。同時実行数が64の場合、最良のケースは、クエリが1つしかない最良のケースとそれほど変わらないことに気付くでしょう。ただし、ここでの最大のポイントは、実行時の合計列です。その値は、最初のスレッドがクエリを送信したときとの時間の差です(すべてのスレッドが基本的に同時にクエリを送信しますが、64コアのマシンを実行する必要がないため、「正確に」同時に送信することはできません。テストスクリプトオン)最後のスレッドが応答を受信したときまで。
観察:幸いなことに、平均0.005586秒かかる64クエリは、実行に64*0.005586秒=0.357504秒を必要としませんでした...64* 0.001089(ベストケース時間)=0.06696すべても必要ありませんでしたこれらのクエリのうち、0.019841秒以内に開始および終了しました...または、理論的に次々に実行されるのにかかる時間の約28.5%にすぎません。
もちろん、悪いニュースは、64の同時実行でのこのクエリの平均実行時間は1回だけ実行される時間の5倍以上であり、最悪の場合はほぼ14倍です。しかし、それでも、単一クエリの実行時間からの線形外挿が示唆するよりもはるかに優れています。
ただし、物事は無期限に拡大縮小するわけではありません。ご覧のとおり、パフォーマンスは同時実行によって低下し、ある時点で、最初に発生したボトルネックに到達すると、下り坂になります(おそらくかなり急速に)。テーブルの数、クエリの性質、発生するロックはすべて、ストレージのパフォーマンス、システムのメモリのサイズ、パフォーマンス、アーキテクチャ、およびMySQLの内部-調整できるものとできないものがあります。
しかしもちろん、データベースだけが要因ではありません。アプリケーションサーバーが同時リクエストを処理する方法は、負荷がかかった状態でのパフォーマンスのもう1つの大きな部分であり、データベースよりも大きい場合もあれば、小さい場合もあります。
ベンチマークからの大きな不明な点の1つは、データベースがクエリに応答するために費やす時間、アプリケーションサーバーがロジックビジネスを実行するために費やす時間、およびコードであるコードが費やす時間です。ページの結果をHTMLにレンダリングします。