Beschleunigen Sie MySQL-Einfügungen mit Partitionen auf MyISAM mit einem eindeutigen Schlüssel
9
Ich habe eine große MyISAM-Tabelle (~ 30 Millionen Zeilen). Irgendwann habe ich es auf das feste Zeilenformat umgestellt, sodass die Tabelle jetzt ~ 40 GB auf der Festplatte und 2 GB für Indizes benötigt. Die Tabelle hat einen eindeutigen Index und es gibt 100 Abfragen zum Einfügen bei doppelter Schlüsselaktualisierung pro Sekunde. Wenn der Tisch wächst, werden diese Einsätze immer langsamer.
Ich bin mir nicht sicher, aber helfen mir Partitionen, Einfügungen zu beschleunigen?
Erstens sind gleichzeitige Schreibvorgänge definitiv keine Option für den MyISAM-Speicher. Jeder von ihnen sperrt eine ganze Tabelle (außer in einigen Fällen zum Lesen). Wenn InnoDB nicht gut zu Ihnen passt, versuchen Sie es mit TokuDB. Aufgrund der Transaktionsnatur der TokuDB-Engine (und natürlich der InnoDB-Engine) ist sie im Vergleich zu MyISAM jedoch langsamer (Sie sollten dieselben Daten mindestens zweimal schreiben: Journal- und Datendateien). Wenn Ihr Server eines Tages abstürzt, warten Sie stundenlang, bis Ihre 40-Gbit-MyISAM-Tabelle repariert ist.
Wenn Sie dennoch Daten in Ihre MyISAM-Tabellen laden möchten und dies schnell tun möchten, kann ich die Verwendung LOAD DATA INFILEanstelle von Einfügungen empfehlen . Dies ist der schnellste Weg, um große Datenmengen in eine Tabelle zu laden. Und ja, Indizes verlangsamen die Leistung beim Einfügen auf exponentielle Weise.
Ein Wort zu Partitionen: INSERT-Anweisungen in MySQL unterstützen das Bereinigen nicht, daher werden alle Ihre Partitionen auf jeder Anweisung auf eindeutige Indexübereinstimmung überprüft. Außerdem werden alle Partitionen gesperrt, bis das Einfügen endet.
Sind diese Einfügeabfragen gleichzeitig oder stammen sie aus demselben Prozess? Wenn sie gleichzeitig ausgeführt werden, ist es besser, den InnoDB-Speicher für diese Tabelle zu verwenden, da MyISAM die gesamte Tabelle sperrt und InnoDB Zeilensperren verwendet. Wenn ein Wechsel zu einem anderen Speicher nicht möglich ist, können Sie die Anweisung INSERT DELAYED und eine Reihe anderer Einfügungsoptimierungen ausprobieren . Partitionierung hilft nur, wenn Sie unterschiedliche Partitionen auf unterschiedlichen physischen Datenträgern platzieren.
Diese Einfügungen sind gleichzeitig. InnoDB ist jedoch zu langsam beim Einfügen bei doppelter Schlüsselaktualisierung, sodass dies keine Option ist. Soweit ich das beurteilen kann, handelt es sich bei IO nicht um einen Engpass - die RAM-Größe >> der Tabellen, einschließlich Indizes und Writecaching, ist aktiviert. Ich denke, das Problem liegt irgendwo in den internen MySQL-Schlössern oder so.
d0rc
INSERT DELAYED sollte nur für INSERT-Anweisungen verwendet werden, die Wertelisten angeben. Der Server ignoriert DELAYED für INSERT ... SELECT oder INSERT ... ON DUPLICATE KEY UPDATE-Anweisungen.
Lazzaro
"InnoDB ist zu langsam" - haben Sie versucht, es ein bisschen zu tunen? Die Standardeinstellungen sind ziemlich schlecht.
Sind diese Einfügeabfragen gleichzeitig oder stammen sie aus demselben Prozess? Wenn sie gleichzeitig ausgeführt werden, ist es besser, den InnoDB-Speicher für diese Tabelle zu verwenden, da MyISAM die gesamte Tabelle sperrt und InnoDB Zeilensperren verwendet. Wenn ein Wechsel zu einem anderen Speicher nicht möglich ist, können Sie die Anweisung INSERT DELAYED und eine Reihe anderer Einfügungsoptimierungen ausprobieren . Partitionierung hilft nur, wenn Sie unterschiedliche Partitionen auf unterschiedlichen physischen Datenträgern platzieren.
quelle