Meine Anwendung ist sehr datenbankintensiv. Momentan führe ich MySQL 5.5.19 aus und verwende MyISAM, bin aber dabei, auf InnoDB zu migrieren. Das einzige verbleibende Problem ist die Leistung der Prüfsumme.
Meine Anwendung führt CHECKSUM TABLE
in Spitzenzeiten ca. 500-1000 Anweisungen pro Sekunde aus, da die Benutzeroberfläche des Clients die Datenbank ständig nach Änderungen abfragt (es handelt sich um ein Überwachungssystem, das daher sehr reaktionsschnell und schnell sein muss).
Mit MyISAM gibt es Live-Prüfsummen, die bei der Tabellenänderung vorberechnet werden und SEHR schnell sind. In InnoDB gibt es so etwas jedoch nicht. Also, CHECKSUM TABLE
ist sehr langsam.
Ich hatte gehofft, die letzte Aktualisierung der Tabelle überprüfen zu können. Leider ist dies auch in InnoDB nicht möglich. Ich stecke jetzt fest, weil Tests gezeigt haben, dass die Leistung der Anwendung drastisch abnimmt.
Es gibt einfach zu viele Codezeilen, die die Tabellen aktualisieren, sodass die Implementierung von Logik in der Anwendung zum Protokollieren von Tabellenänderungen nicht in Frage kommt.
Gibt es eine schnelle Methode zum Erkennen von Änderungen in InnoDB-Tabellen?
quelle
Ich denke, ich habe die Lösung gefunden. Ich habe eine Zeit lang nach Percona Server gesucht, um meine MySQL-Server zu ersetzen, und jetzt glaube ich, dass es einen guten Grund dafür gibt.
Percona Server führt viele neue INFORMATION_SCHEMA-Tabellen wie INNODB_TABLE_STATS ein, die in Standard-MySQL-Servern nicht verfügbar sind. Wenn Sie das tun:
Sie erhalten die tatsächliche Zeilenzahl und einen Zähler. In der offiziellen Dokumentation heißt es zu diesem Feld:
Dieser Zähler wird also von Zeit zu Zeit umgebrochen. Sie können jedoch eine Prüfsumme aus der Anzahl der Zeilen und dem Zähler erstellen. Bei jeder Änderung der Tabelle erhalten Sie eine eindeutige Prüfsumme. Z.B:
Ich wollte sowieso meine Server auf Percona-Server upgraden, sodass diese Einschränkung für mich kein Problem darstellt. Das Verwalten von Hunderten von Triggern und das Hinzufügen von Feldern zu Tabellen ist für diese Anwendung ein großes Problem, da die Entwicklung sehr spät ist.
Dies ist die PHP-Funktion, die ich entwickelt habe, um sicherzustellen, dass Tabellen unabhängig von der verwendeten Engine und dem verwendeten Server mit Prüfsummen versehen werden können:
Du kannst es so benutzen:
Ich hoffe, dies erspart anderen Menschen, die das gleiche Problem haben, einige Schwierigkeiten.
quelle
Sie sollten auf Mysql v5.6 + aktualisieren, da innodb auch die Prüfsummentabelle unterstützt. http://dev.mysql.com/doc/refman/5.6/en/checksum-table.html
Andernfalls wäre die ideale Lösung, wenn Ihr Client nicht ständig nach Ergebnissen fragt, sondern Sie neue und geänderte Daten abrufen, wenn diese verfügbar sind. Es wäre schneller und der Server würde weniger belastet. Wenn Sie eine webbasierte Benutzeroberfläche verwenden, sollten Sie sich APE http://ape-project.org/ oder andere ähnliche Projekte ansehen .
quelle
Wenn Sie hauptsächlich zu einer Tabelle hinzufügen, können Sie AUTO_INCREMENT als Maß für die Aktualität verwenden.
Aber ich würde es vorziehen, auf eine externe Quelle wie einen Zähler in Memcached zu verweisen, den Sie jedes Mal erhöhen, wenn Sie etwas in der Datenbank ändern.
quelle
Sie könnten versuchen, Folgendes zu tun:
Dies gibt eine Zahl zurück, die mit jeder Tabellenaktualisierung zunimmt. Wenn Sie dies nachverfolgen, können Sie Änderungen erkennen.
Wichtiger Hinweis: Der Wert wird sofort nach einem UPDATE geändert, nicht nach einem COMMIT. Daher werden die Änderungen möglicherweise nicht angezeigt, wenn sie in einer anderen Transaktion vorgenommen wurden, die nicht abgeschlossen wurde.
quelle
Diese Antwort hat nichts mit MySQL-Datenbankversionen oder -typen zu tun. Ich wollte wissen, ob Update-Anweisungen Änderungen vornehmen UND dies in meinem PHP-Code tun.
Erstellt eine Dummy-Tabelle mit einem Datensatz und einem Feld, die ich abfragen würde, um den Wert von MySQLs current_timestamp zu erhalten.
Fügen Sie der zu aktualisierenden Datentabelle ein Zeitstempelfeld hinzu und verwenden Sie die mysql-Option "ON UPDATE CURRENT_TIMESTAMP".
Verglichen mit # 1 und # 2
Dies wird in den meisten Fällen nicht 100% ig funktionieren, aber für meine Anwendung war es eine einfache und großartige Lösung. Hoffe das hilft jemandem
quelle