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

Warum ist die geschätzte Zeilenanzahl in den phpmyadmin-Ergebnissen sehr unterschiedlich?

Im Gegensatz zu MyISAM-Tabellen verfolgen InnoDB-Tabellen nicht, wie viele Zeilen die Tabelle enthält.

Aus diesem Grund besteht die einzige Möglichkeit, die genaue Anzahl der Zeilen in einer InnoDB-Tabelle zu ermitteln, darin, jede Zeile in der Tabelle zu untersuchen und eine Zählung zu akkumulieren. Führen Sie daher bei großen InnoDB-Tabellen ein SELECT COUNT(*) FROM innodb_table durch -Abfrage kann sehr langsam sein, da sie einen vollständigen Tabellenscan durchführt, um die Anzahl der Zeilen abzurufen.

phpMyAdmin verwendet eine Abfrage wie SHOW TABLE STATUS um eine geschätzte Anzahl der Zeilen in der Tabelle von der Engine (InnoDB) zu erhalten. Da es sich nur um eine Schätzung handelt, variiert sie jedes Mal, wenn Sie sie aufrufen. Manchmal können die Abweichungen ziemlich groß sein, und manchmal liegen sie nahe beieinander.

Hier ist ein informativer Blogbeitrag über COUNT(*) for InnoDB-Tabellen von Percona.

Die MySQL-Handbuchseite für SHOW TABLE STATUS Zustände:

Die Anzahl der Zeilen. Einige Speicher-Engines wie MyISAM speichern die genaue Anzahl. Für andere Speicher-Engines wie 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 Zählung zu erhalten.

Die Seite zu InnoDB-Einschränkungen geht noch etwas ins Detail:

SHOW TABLE STATUS liefert keine genauen Statistiken zu InnoDB-Tabellen, mit Ausnahme der physischen Größe, die von der Tabelle reserviert wird. Die Zeilenanzahl ist nur eine grobe Schätzung, die bei der SQL-Optimierung verwendet wird.

InnoDB führt keine interne Anzahl von Zeilen in einer Tabelle, da gleichzeitige Transaktionen unterschiedliche Anzahlen von Zeilen gleichzeitig „sehen“ können. Zum Verarbeiten eines SELECT COUNT(*) FROM t -Anweisung scannt InnoDB einen Index der Tabelle, was einige Zeit in Anspruch nimmt, wenn sich der Index nicht vollständig im Pufferpool befindet. Wenn sich Ihre Tabelle nicht oft ändert, ist die Verwendung des MySQL-Abfrage-Cache eine gute Lösung. Um eine schnelle Zählung zu erhalten, müssen Sie eine Zählertabelle verwenden, die Sie selbst erstellen, und Ihre Anwendung entsprechend den Einfügungen und Löschungen aktualisieren lassen. Wenn eine ungefähre Zeilenanzahl ausreicht, SHOW TABLE STATUS verwendet werden. Siehe Abschnitt 14.3.14.1, „InnoDB Performance Tuning-Tipps“ .