Ich habe ein Cron-Skript, das täglich ausgeführt wird, um DATA INFILE in eine MySQL-Datenbank zu laden. Ich möchte mithilfe von PHP als Teil einer Webanwendung einen wöchentlichen Bericht erstellen, der die Gesamtzahl der eingefügten Datensätze der letzten 7 Tage zeigt.
Ich würde gerne wissen, wie ich das am besten angehen soll. MySQL zu patchen oder zu modifizieren ist keine Option, und die Art und Weise zu ändern, wie Daten eingefügt werden, ist auch keine Option. Ich würde es vorziehen, das Zählen der CSV-Dateien vor dem Einfügen zu vermeiden, da es unübersichtlich wäre, diese Daten wieder in PHP einzulesen.
Vorschläge?
Antwort1
Muss es innerhalb der PHP-App sein? In Ihrem Cron-Skript könnten Sie die Anzahl der einzufügenden Zeilen zählen und diese entweder einer Protokolldatei oder einer kleinen Protokolltabelle in der MySQL-Datenbank hinzufügen (es sei denn, das ist, was Sie mit „MySQL ändern“ meinen). Ich bin nicht sicher, aber ich vermute, dass die MySQL-Funktion row_count() auch mit INFILE-Daten funktioniert, sodass das Zählen der Zahlen einfach wäre.
Und, vielleicht die einfachste Methode: Wenn die Zeilen nach dem Einfügen nicht geändert werden, können Sie der Datenbank eine Zeitstempelspalte hinzufügen, die automatisch auf das Datum des Einfügens gesetzt wird und die Zahlen für eine Woche hochzählt.
Antwort2
Verwenden Sie die PHP-Funktion mysql_info() unmittelbar nachdem Sie Ihre LOAD DATA INFILE-Abfrage ausgeführt haben. Dies gibt eine Zeichenfolge wie die folgende zurück:
Datensätze: 1 Gelöscht: 0 Übersprungen: 0 Warnungen: 0
SehenPHP-Funktionsreferenz: mysql_info() Verbunden damit wäre diemysql_affected_rows()Funktion.
Was auch immer Sie tun, verlassen Sie sich nicht auf die Zeilenanzahl in SHOW TABLE STATUS. Sie kann je nach Speicher-Engine völlig falsch sein und ist eigentlich nur für den Abfrageoptimierer nützlich, um Optimierungen besser beurteilen zu können. Dies ist dokumentiert inTABELLENSTATUS ANZEIGEN(mit dem hier zitierten spezifischen Abschnitt)
Reihen
Die Anzahl der Zeilen. Einige Speicher-Engines, wie etwa MyISAM, speichern die genaue Anzahl. Für andere Speicher-Engines, wie etwa InnoDB, ist dieser Wert ein Näherungswert und kann um bis zu 40 bis 50 % vom tatsächlichen Wert abweichen. Verwenden Sie in solchen Fällen SELECT COUNT(*), um eine genaue Anzahl zu erhalten.
Der Zeilenwert ist für Tabellen in der INFORMATION_SCHEMA-Datenbank NULL.
Antwort3
Wenn Sie nur an der Anzahl der Zeilen in bestimmten Schemata und Tabellen interessiert sind (und vorausgesetzt, dass keine Zeilen gelöscht wurden), können Sie den MySQL-Befehl verwenden show table status
oder in der Befehlszeile verwenden mysqlshow --status dbname
. Dadurch werden für jede Tabelle im Schema einige erweiterte Informationen aufgelistet, einschließlich der Zeilenanzahl (oder Sie können verwenden, like
um bestimmte Tabellen auszuwählen).
Dieselben Daten können mit einfachem SQL aus der INFORMATION_SCHEMA-Datenbank abgerufen werden, beispielsweise wie folgt:
SELECT Tabellenname, SUM(Tabellenzeilen) FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME in ('Tabelle1', 'Tabelle2');
Sie können einen einfachen Cron-Job erstellen, der diesen Snapshot einmal am Tag erstellt. Anschließend sollte es ziemlich einfach sein, diese Daten auf nützliche Weise aus PHP zu extrahieren. Sie können sie sogar in einer Datenbanktabelle speichern ;-)