クライアントをサーバーとは別のマシンに分割しましたか?これは、スケーリングの最初のマイナーなステップです。
スレーブに送信されたレプリケーションおよび読み取り専用クエリはありますか?これにより、無制限の読み取りが可能になります スケーリング。 (ただし、これは、マスターの負荷を軽減する以外に、UPDATEの質問には対応していません。)
単一の回転するディスク上の115IOPは、それをかなり飽和させます。 innodb_flush_log_at_trx_commitのデフォルトは1です。これにより、トランザクションごとに少なくとも1つのIOPが発生します。いくつかの一時的な解決策(トラフィックがさらに10倍になるまで)...
SSD-おそらく1000IOPS。
更新をバッチ処理します(@N。Bで言及されているなど)。これにより、「フラッシュ」の数が100分の1に削減されます。
innodb_flush_log_at_trx_commit =2--フラッシュを事実上排除します(セキュリティがいくらか失われます)。
しかし-更新を十分に速く実行できたとしても、値を読み取る必要はありませんか?つまり、競合が発生します。 同じのSELECTの数 テーブルをやっていますか? 100/秒で問題ない可能性があります。 1000 /秒は、干渉が多すぎて機能しない可能性があります。
テーブルの大きさはどれくらいですか?これを機能させるには、常にキャッシュできるように十分に小さくする必要があります。
Redditは別のアプローチです-そこで更新をキャプチャします。次に、累積カウントを継続的に引き出し、必要な更新を行います。
シャーディング-これは、データを複数のマシンに分割する場所です。ユーザーIDのハッシュまたはルックアップ(または2つの組み合わせ)で分割するのが一般的です。次に、UPDATEは更新するマシンを特定し、そこでアクションを実行する必要があります。シャード(マシン)が10個ある場合、更新レートのほぼ10倍を維持できます。最終的に、これはすべてのヘビーヒッターが1億人以上のユーザーと1日あたり数十億のクエリを処理できる唯一の方法です。
PARTITIONINGは役に立たない可能性があります。パーティションプルーニングコードは、このような小さなクエリのオーバーヘッドを回避するにはまだ十分に効率的ではありません。