Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Hochvolumige Aktualisierungszähler Mysql

Haben Sie den Client vom Server in eine separate Maschine aufgeteilt? Das ist ein erster kleiner Schritt bei der Skalierung.

Haben Sie Replikations- und schreibgeschützte Abfragen an Slaves gesendet? Das kann unbegrenztes Lesen ermöglichen Skalierung. (Aber dies spricht nicht die UPDATE-Frage an, außer um den Master zu entlasten.)

115 IOPs auf einer einzelnen, sich drehenden Festplatte werden sie ziemlich sättigen. innodb_flush_log_at_trx_commit ist standardmäßig 1, was zu mindestens 1 IOP pro Transaktion führt. Einige vorübergehende Lösungen (bis Ihr Traffic um das 10-fache wächst)...

SSDs – vielleicht 1000 IOPs.

Stapeln Sie die Aktualisierungen (wie von @N. B. erwähnt) Dies reduziert die Anzahl der "Flushes" um das 100-fache.

innodb_flush_log_at_trx_commit =2 -- um die Flushes praktisch zu eliminieren (mit einem gewissen Sicherheitsverlust).

Aber -- Selbst wenn Sie die UPDATEs schnell genug machen können, müssen Sie nicht auch die Werte lesen? Das heißt, es wird Streit geben. Wie viele SELECTs auf dem selben Tisch machst du? 100/s könnten ok sein; 1000/s können so viele Interferenzen verursachen, dass es nicht funktioniert.

Wie groß ist der Tisch? Damit all dies funktioniert, muss es klein genug sein, um ständig zwischengespeichert zu werden.

Reddit ist ein anderer Ansatz – erfassen Sie die Updates dort. Ziehen Sie dann kontinuierlich akkumulierte Zählungen heraus und führen Sie die erforderlichen UPDATEs durch.

Sharding – Hier teilen Sie die Daten auf mehrere Rechner auf. Das Aufteilen der Benutzer-ID nach einem Hash oder Lookup (oder einer Kombination aus beidem) ist üblich. Dann muss das UPDATE herausfinden, welche Maschine aktualisiert werden soll, und dann die Aktion dort ausführen. Wenn Sie 10 Shards (Maschinen) haben, können Sie die fast 10-fache Aktualisierungsrate aufrechterhalten. Letztendlich ist dies die einzige Möglichkeit, wie alle Schwergewichte mehr als 100 Millionen Nutzer und Milliarden von Anfragen pro Tag bewältigen können.

PARTITIONierung wird wahrscheinlich nicht helfen. Der Partitionsbereinigungscode ist noch nicht effizient genug, um zu viel Overhead für eine so kleine Abfrage zu vermeiden.