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)
mysql
innodb
mysql-5.5
transaction
dünnes Eis
quelle
quelle
Antworten:
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:
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
quelle