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

Warum ist der SHOW TABLE STATUS von innodb so unzuverlässig?

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

ab
mysql> 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

zu erhalten
SELECT FOUND_ROWS();

die die korrekte Tabellenzeilensumme der vorherigen zwischengespeicherten Abfrage zurückgibt.