Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Schnellere Möglichkeit zum Löschen übereinstimmender Zeilen?

Das Löschen von Daten aus InnoDB ist die teuerste Operation, die Sie von ihr verlangen können. Wie Sie bereits festgestellt haben, ist die Abfrage selbst nicht das Problem - die meisten von ihnen werden sowieso für denselben Ausführungsplan optimiert.

Auch wenn es schwer zu verstehen ist, warum DELETES ausgerechnet am langsamsten sind, gibt es eine ziemlich einfache Erklärung. InnoDB ist eine Transaktionsspeicher-Engine. Das heißt, wenn Ihre Abfrage mittendrin abgebrochen würde, wären alle Datensätze immer noch vorhanden, als ob nichts passiert wäre. Sobald es fertig ist, werden alle im selben Moment verschwunden sein. Während des LÖSCHENS sehen andere Clients, die sich mit dem Server verbinden, die Aufzeichnungen, bis Ihr DELETE abgeschlossen ist.

Um dies zu erreichen, verwendet InnoDB eine Technik namens MVCC (Multi Version Concurrency Control). Im Grunde gibt es jeder Verbindung eine Momentaufnahme der gesamten Datenbank, wie sie war, als die erste Anweisung der Transaktion gestartet wurde. Um dies zu erreichen, kann jeder Datensatz in InnoDB intern mehrere Werte haben – einen für jeden Snapshot. Aus diesem Grund dauert das COUNTing auf InnoDB auch einige Zeit - es hängt vom Snapshot-Status ab, den Sie zu diesem Zeitpunkt sehen.

Für Ihre DELETE-Transaktion wird jeder einzelne Datensatz, der gemäß Ihren Abfragebedingungen identifiziert wurde, zum Löschen markiert. Da möglicherweise andere Clients gleichzeitig auf die Daten zugreifen, kann er sie nicht sofort aus der Tabelle entfernen, da sie ihren jeweiligen Snapshot sehen müssen, um die Unteilbarkeit der Löschung zu gewährleisten.

Sobald alle Datensätze zum Löschen markiert wurden, wird die Transaktion erfolgreich festgeschrieben. Und selbst dann können sie nicht sofort von den eigentlichen Datenseiten entfernt werden, bevor alle anderen Transaktionen, die vor Ihrer DELETE-Transaktion mit einem Snapshot-Wert gearbeitet haben, ebenfalls beendet sind.

So langsam sind Ihre 3 Minuten also gar nicht, wenn man bedenkt, dass alle Datensätze modifiziert werden müssen, um sie transaktionssicher zum Entfernen vorzubereiten. Wahrscheinlich "hören" Sie Ihre Festplatte arbeiten, während die Anweisung ausgeführt wird. Dies wird durch den Zugriff auf alle Zeilen verursacht. Um die Leistung zu verbessern, können Sie versuchen, die Größe des InnoDB-Pufferpools für Ihren Server zu erhöhen und andere Zugriffe auf die Datenbank einzuschränken, während Sie LÖSCHEN, wodurch auch die Anzahl der historischen Versionen verringert wird, die InnoDB pro verwalten muss record.Mit dem zusätzlichen Speicher kann InnoDB Ihre Tabelle möglicherweise (meistens) in den Speicher lesen und einige Suchzeiten auf der Festplatte vermeiden.