Die offizielle MySQL 5.1 Dokumentation
erkennt an, dass InnoDB mit SHOW TABLE STATUS
keine genauen Statistiken liefert . Während MYISAM-Tabellen speziell einen internen Cache für Metadaten wie die Anzahl der Zeilen usw. halten, speichert die InnoDB-Engine sowohl Tabellendaten als auch Indizes in */var/lib/mysql/ibdata**
InnoDB hat keine sinnvolle Indexdatei, die eine schnelle Abfrage von Zeilennummern ermöglicht.
Inkonsistente Tabellenzeilennummern werden von SHOW TABLE STATUS
gemeldet weil InnoDB den „Zeilen“-Wert dynamisch schätzt, indem es einen Bereich der Tabellendaten (in */var/lib/mysql/ibdata**) abtastet und dann die ungefähre Anzahl von Zeilen extrapoliert. So sehr, dass die InnoDB-Dokumentation bei Verwendung von SHOW TABLE STATUS
eine Ungenauigkeit der Zeilennummer von bis zu 50 % anerkennt
Die MySQL-Dokumentation schlägt vor, den MySQL-Abfrage-Cache zu verwenden, um konsistente Zeilennummernabfragen zu erhalten, aber die Dokumentation gibt nicht an, wie . Eine kurze Erklärung, wie dies geschehen kann, folgt.
Überprüfen Sie zunächst, ob das Abfrage-Caching aktiviert ist:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Wenn der Wert von have_query_cache ist NEIN Aktivieren Sie dann den Abfrage-Cache, indem Sie die folgenden Zeilen zu /etc/my.cnf hinzufügen und starten Sie dann mysqld neu.
have_query_cache=1 # added 2017 08 24 wh
query_cache_size = 1048576
query_cache_type = 1
query_cache_limit = 1048576
(Weitere Informationen finden Sie unter http://dev.mysql. com/doc/refman/5.1/en/query-cache.html )
Fragen Sie den Inhalt des Caches mit
abmysql> SHOW STATUS LIKE 'Qcache%';
Verwenden Sie nun die SQL_CALC_FOUND_ROWS
-Anweisung in einem SELECT
Abfrage:
SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS
versucht einen Lesevorgang aus dem Cache und führt, falls diese Abfrage nicht gefunden wird, die Abfrage für die angegebene Tabelle aus und übergibt dann die Anzahl der Tabellenzeilen an den Abfrage-Cache. Zusätzliche Ausführungen der obigen Abfrage (oder anderer 'zwischenspeicherbarer' SELECT
-Anweisungen - siehe unten) konsultiert den Cache und gibt das richtige Ergebnis zurück.
Nachfolgende 'cachable' SELECT
Abfragen
- auch wenn sie LIMIT
sind das Ergebnis - konsultiert den Abfrage-Cache und ermöglicht es Ihnen, (einmalig) die Gesamtzahl der Tabellenzeilen mit
SELECT FOUND_ROWS();
die die korrekte Tabellenzeilensumme der vorherigen zwischengespeicherten Abfrage zurückgibt.