Deadlocks auf MySQL Zeilen löschen

Haben wir eine (derzeit InnoDB-Tabelle) enthält rund 500.000 Zeilen. Dies stellt eine Warteschlange von Aufgaben ausführen. Es ist in einer MySQL Datenbank abgelegt.

Einer einer kontinuierlichen basis, mindestens einmal pro Sekunde, aber manchmal häufiger, wählen wir die Daten aus und anschließend update einige Zeilen. Einmal pro Tag, wir prune-alte Zeilen aus der Tabelle.

Begannen wir bekommen deadlocks auf dem Tisch und dieser brachte unsere Aufgabe die Verarbeitung zum Stillstand. Diese deadlocks verursacht wurden während der nächtlichen prune ausführen. Die Kombination von DELETE -, SELECT-und UPDATE gemeint, das im wesentlichen nichts Produktives passieren könnte. Leider habe ich die Ausgabe von SHOW ENGINE INNODB STATUS.

Ich würde gerne wissen, die beste option für den Umgang mit dieser. Beachten Sie, dass unser code erkennt deadlocks und stellt erneut die Abfrage. Auch wir längst entdeckt, dass mit dem löschen alle übereinstimmenden Zeilen auf einmal war zu anstrengend für eine Datenbank-Tabelle, die sah eine Menge von Aktivitäten, so BESCHRÄNKEN wir unsere löscht auf 10.000 Zeilen zu einer Zeit und halten Sie auf der Neuauflage der Abfrage, bis alle erforderlichen Zeilen beschnitten werden.

Ich sehe die folgenden Optionen, und würde gerne Meinungen auf, welche sind die besten, oder Vorschläge für andere Optionen:

  1. LÖSCHEN weniger Zeilen in einer Zeit,
  2. Exponentielle backoff auf unserer Löscht, aber ich bin besorgt, dass dies wird nicht helfen, in Anbetracht unserer spezifischen workload
  3. LOCK TABLES als pro MySQL-Dokumentation. Könnten wir wohl akzeptieren, blockiert die SELECT-und UPDATE-Anweisungen für die Dauer der löscht.
  4. Schalter für MyISAM-Tabellentyp. Wir gingen mit InnoDB, da waren wir zunächst über die Transaktionen, die auf dieser Tabelle. Ist dies nicht mehr der Fall. Ich bin nicht ausreichend vertraut mit den Besonderheiten zu wissen, ob dies ist eine praktikable Lösung.
  5. Vielleicht verwenden Sie UPDATE LOW_PRIORITY. Kann sein, dass der Löscht sich nicht auf den Wählt, nur die UPDATEs, und dies kann ausreichend sein.
  • Alle deadlocks, die ich angetroffen habe, war aufgrund von uncommitted Transaktionen. Sicherzustellen, dass Sie ordnungsgemäß ausgeführten Transaktionen (entweder mit autocommit auf oder autocommit off und tatsächlich Umgang mit commit/rollbacks).
  • Definitiv ein guter Punkt; dies wäre der Fall, die meisten der Zeit, aber wir tun gar nicht, Transaktionen auf diesem Tisch. Wir verwendet, um, aber nicht mehr tun.
Schreibe einen Kommentar