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

Die Aktualisierung mit `database/sql` in Go ist langsam

(Aus Sicht von MySQL gesprochen...)

Einige "Faustregeln":

  • Einzelnes INSERT :10ms
  • 100 oder mehr Zeilen, die durch einen einzigen INSERT eingefügt werden :10 mal so schnell pro Reihe.
  • BEGIN; INSERT...; INSERT...; ... COMMIT; :Auch 10x.
  • Das Obige setzt HDD voraus; SSD könnte noch 10x schneller sein.
  • Wenn mehrere Verbindungen jeweils Einfügungen vornehmen, können sie parallel laufen können. 10 Threads können in derselben verstrichenen Zeit möglicherweise das Fünffache der Arbeit erledigen. (Das kann natürlich der App unerwünschte Komplexität hinzufügen.)

Ähnliche Zahlen für UPDATE , obwohl es nicht einfach ist, verschiedene Aktualisierungen für verschiedene Zeilen mit einer einzigen Abfrage durchzuführen.

Ihr Test zeigt 8,5 ms pro Zeile UPDATEd wenn Sie eine Reihe nach der anderen machen. Batching entweder mit BEGIN...COMMIT wird wahrscheinlich etwa 85 ms für alle 100 Zeilen dauern, selbst auf HDD.

Einige Anwendungen eignen sich für Batching; manche nicht. Wenn Sie über die Verbesserung der MySQL-Leistung sprechen möchten, müssen wir uns mit den Details Ihrer Anwendung befassen.

"Gefällt mir"- und "Ansehen"-Zähler dürfen müssen in eine "parallele" Tabelle verschoben werden, da sie dazu neigen, einzeln aktualisiert zu werden, mit einigen Interferenzen mit anderen Aktivitäten. Sie neigen auch dazu, automatisch Multi-Threading zuzulassen, daher viel weniger als 850 ms pro 100. Bei sehr hoher Aktivität (über beispielsweise 1.000 Aufrufe pro Sekunde) können solche Zähler künstlich über zusätzlichen App-Code gestapelt werden.

Bitte schreiben Sie Ihren Benchmark neu, um die Aktivität widerzuspiegeln, die in der realen Anwendung stattfinden wird. (Ich vermute dass die Updates parallel erfolgen, nicht seriell. Und sie werden zufällig über die Zeit verteilt.)

Noch was... Wenn jeder "Viewcount" auf einen Webserver kommt, dann gibt es auch Connect und Disconnect; daher das verstrichene Zeit wird wahrscheinlich mehr als 8,5 ms betragen. Aber "verstrichen" ist nicht das kritische Thema; das eigentliche Problem ist "wie viele Aktualisierungen pro Sekunde durchgeführt werden können".)

Und noch etwas ... Wenn Sie "parallel" testen, treffen Sie nicht bei jeder Anfrage dieselbe Zeile. Das wird wahrscheinlich viel langsamer sein, als wenn Sie verschiedene Reihen treffen. (Es wäre besser, eine zufällige Reihe zu treffen. Es wäre noch realistischer, eine Voreingenommenheit zu haben, welche Reihe getroffen werden soll.)