MySQL-Transaktionsgröße - wie groß ist zu groß?

23

Ich habe einen Importprozess, der von Zeit zu Zeit ausgeführt wird, und ich möchte, dass es sich um eine Art "Alles oder Nichts" handelt, auch bekannt als: eine Transaktion.

Es gibt viele Aspekte, und die Importe können irgendwo zwischen 100k-1mil + Aufzeichnungen ergeben. Dies entspricht einer Nutzlast von mehreren MB bis zu einigen hundert MB Daten.

Ich weiß, dass temporäre Tabellen eine weitere Option sind - aber diese Methode scheint so praktisch zu sein.

Gibt es irgendwelche Vorbehalte bezüglich dieser Art von Praktiken mit einer großen Menge an Datenmanipulation zwischen Commits? (Außerhalb des typischen Bursts für Schreib- / Indexladevorgänge nach dem Festschreiben)

dünnes Eis
quelle
Persönlich mag ich ein Gleichgewicht haben. Ich importiere in 1k- oder 10k-Transaktionen, weil ich nur weiß, dass es zu ungefähr 900k-Zeilen kommen und dann wegen Puffergröße oder etwas anderem Lächerlichem abstürzen würde. Das ist ziemlich einfach und nicht so viel I / O.
Kapitän Hypertext

Antworten:

20

Ein zu beachtender Engpass ist der InnoDB-Protokollpuffer. Die Größe wird durch innodb_log_buffer_size festgelegt . Folgendes steht in der MySQL-Dokumentation dazu:

Die Größe des Puffers in Byte, den InnoDB zum Schreiben in die Protokolldateien auf der Festplatte verwendet. Der Standardwert ist 8 MB. Ein großer Protokollpuffer ermöglicht die Ausführung großer Transaktionen, ohne dass das Protokoll vor dem Festschreiben der Transaktionen auf die Festplatte geschrieben werden muss. Wenn Sie also große Transaktionen ausführen, können Sie durch Vergrößern des Protokollpuffers Festplatten-E / A sparen.

Der InnoDB-Protokollpuffer darf nicht mit dem InnoDB-Pufferpool verwechselt werden. Der Hauptunterschied zwischen ihnen ist ihr Zweck. Der InnoDB-Protokollpuffer zeichnet grundsätzlich kurzfristige Änderungen auf, die in die Redo-Protokolle (ib_logfile0, ib_logfile1) geschrieben werden. Der InnoDB- Pufferpool (Größe nach innodb_buffer_pool_size ) speichert Daten und Indexseiten, die festgeschrieben werden sollen (wenn die Seiten verschmutzt sind) und schließlich auf die Festplatte geschrieben werden sollen. Nach dem Festschreiben verbleiben die Änderungsseiten im RAM, bis sie über LRU-Regeln entfernt werden.

Große Transaktionen müssen über den Protokollpuffer geleitet werden. Wie bereits erwähnt, verringert ein größerer Protokollpuffer die Festplatten-E / A. Nur ein großes Commit würde einen Engpass darstellen.

Möglicherweise möchten Sie sich andere InnoDB-Optionen ansehen, um sie zu konfigurieren.

Ich habe andere Posts über die Optimierung von InnoDB für die weitere Forschung

RolandoMySQLDBA
quelle
irgendwie wusste ich, dass du dabei sein würdest. Vielen Dank für die gründlichen Antworten, die Sie immer zu geben scheinen. Nebenfrage: Haben Sie Ressourcen zur Verwendung von innodb_io_capacity? Wenn die Dokumentation vorschlägt, dass ein SATA-Consumer mit 5400 / 7200RPM einen Wert von 100 hat, schlagen Sie als Strategie vor, das Limit einfach zu entfernen, indem Sie diesen Wert so hoch einstellen?
Thinice
Normalerweise setze ich innodb_io_capacity höher und lasse die Hardware das Beste draus machen. Ich werde dies gleich zu meiner Antwort hinzufügen.
RolandoMySQLDBA