Meine Frage ist nicht spezifisch, aber es ist abstrakt. In meinen Projekten beschäftige ich mich oft mit der Verarbeitung von Hintergrund-DBs, habe aber immer noch keine gute Strategie, wie man das richtig macht.MySQL InnoDB, Multithreading, Multiinserts und Sperren. Suche nach der richtigen Strategie
Zum Beispiel haben wir eine Tabelle mit vielen Datensätzen haben, mehrere hunderttausend Datensätze oder Ereignis Millionen. Hintergrund-Daemon ändert die Daten dieser Tabelle permanent. Es aktualisiert und fügt Datensätze basierend auf anderen Daten ein, die von außen eingeholt wurden. Um Zeit zu sparen, verwende ich Multi-INSERTs, um eine Zeit zu sparen, weil ich mir nicht vorstellen kann, wie lange die Aktualisierungsdatensätze einzeln dauern können. Da der Hintergrundprozess im Multi-Threading-Modus ausgeführt wird, musste ich WRITE LOCK für diese Tabelle verwenden. Wenn ich das nicht mache, dann bekomme ich viele Deadlock-Fehler, weil jedes Multi-Insert Lücken und Autoinkremente in der Tabelle blockiert und sie nicht unabhängig voneinander ausführen können. WRITE LOCK versetzt alle Abfragen in die Warteschlange und sie werden nacheinander ausgeführt. Die nächste Abfrage wartet, während die vorherige abgeschlossen ist. Vielleicht ist hier mein erster Fehler, aber ich habe keine andere effektive Methode gefunden, Multi-Inserts im Multithread-Modus auszuführen. Ein einfaches Schema des Daemon sieht so aus:
Von der anderen Seite haben wir eine Benutzeroberfläche, die Daten aus der Tabelle anzeigt. Es führt SELECT-Abfrage von unserer Tabelle aus. Aber wie gesagt, wenn der Hintergrundprozess läuft, ist die WRITE-Sperre aktiviert. Das bedeutet, READ-Operationen sollten auch warten, während die Sperre aktiv ist. Für den Benutzer sieht es aus wie ein ganzer Server gehängt.
, warum ich diese Frage zu schreiben. Gibt es Strategien, große Datenmengen zusammen mit der Lesefähigkeit zu modifizieren?
Die Arbeiter für Daten aufnehmen ** ohne ** Schlösser in einem Arbeitstisch. In Ihren oben genannten Informationen führen diese 3 Mitarbeiter diese Einsätze unabhängig voneinander aus.Entweder onsey-twosey oder lose. Ein Ereignis [001] (http://Stackoverflow.com/a/37901661/1816093) und [Evt-Übersicht] (http://Stackoverflow.com/a/32508935) und [Debugging/Leistungsüberwachung] (http: // stackoverflow.com/a/38022108) wird in Handarbeit gemacht: (fügt ein, fügt mit einem Join-Muster ein, fügt eine doppelte Aktualisierung ein, Sie nennen es) ---> in die reale Tabelle. Wenn die Zeilen in der Worktable verarbeitet werden, werden sie als erledigt markiert. Aufgeräumt am Ende von evt. – Drew
So laufen die Ereignisse oder Ereignisse nach dem Zeitplan Ihrer Wahl. Keine Cron, usw. Sie haben die benötigten Daten. In der Theorie ist der gesamte Sperraspekt entweder beseitigt oder in Umfang und Auswirkung stark reduziert. – Drew