sql >> データベース >  >> RDS >> Mysql

大量更新カウンターMysql

    クライアントをサーバーとは別のマシンに分割しましたか?これは、スケーリングの最初のマイナーなステップです。

    スレーブに送信されたレプリケーションおよび読み取り専用クエリはありますか?これにより、無制限の読み取りが可能になります スケーリング。 (ただし、これは、マスターの負荷を軽減する以外に、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は役に立たない可能性があります。パーティションプルーニングコードは、このような小さなクエリのオーバーヘッドを回避するにはまだ十分に効率的ではありません。




    1. Laravel関係エラー:未定義のプロパティ:1行目のIlluminate \ Database \ Eloquent \ Collection ::$ id

    2. データ型の変更によって増大したSQLServerテーブルのサイズを縮小する方法

    3. 2つのテーブルを3番目のテーブルのFKと結合する必要があります

    4. SQL FOREIGN KEY CONSTRAINT:初心者のための究極の簡単なガイド