De officiële MySQL 5.1 documentatie
erkent dat InnoDB geen nauwkeurige statistieken geeft met SHOW TABLE STATUS
. Terwijl MYISAM-tabellen specifiek een interne cache van metagegevens bewaren, zoals het aantal rijen enz., slaat de InnoDB-engine zowel tabelgegevens als indexen op in */var/lib/mysql/ibdata**
InnoDB heeft geen handig indexbestand waarmee u snel rijnummers kunt opvragen.
Inconsistente tabelrijnummers worden gerapporteerd door SHOW TABLE STATUS
omdat InnoDB de waarde van 'Rijen' dynamisch schat door een reeks tabelgegevens te samplen (in */var/lib/mysql/ibdata**) en vervolgens het geschatte aantal rijen extrapoleert. Zozeer zelfs dat de InnoDB-documentatie een onnauwkeurigheid van rijnummers tot 50% erkent bij gebruik van SHOW TABLE STATUS
MySQL-documentatie suggereert het gebruik van de MySQL-querycache om consistente rijnummerquery's te krijgen, maar de documenten specificeren niet hoe . Hieronder volgt een beknopte uitleg hoe dit kan.
Controleer eerst of querycaching is ingeschakeld:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Als de waarde van have_query_cache is NEE schakel vervolgens de querycache in door de volgende regels toe te voegen aan /etc/my.cnf en herstart mysqld.
have_query_cache=1 # added 2017 08 24 wh
query_cache_size = 1048576
query_cache_type = 1
query_cache_limit = 1048576
(voor meer informatie zie http://dev.mysql. com/doc/refman/5.1/en/query-cache.html )
Vraag de inhoud van de cache op met
mysql> SHOW STATUS LIKE 'Qcache%';
Gebruik nu de SQL_CALC_FOUND_ROWS
statement in een SELECT
vraag:
SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS
zal proberen de cache te lezen en, als deze query niet wordt gevonden, de query uitvoeren op de opgegeven tabel en vervolgens het aantal tabelrijen vastleggen in de querycache. Extra uitvoeringen van de bovenstaande query (of andere 'cachable' SELECT
statements - zie hieronder) zal de cache raadplegen en het juiste resultaat teruggeven.
Daaropvolgende 'cachable' SELECT
vragen
- zelfs als ze LIMIT
het resultaat - raadpleegt de querycache en stelt u in staat om (eenmalig) de totale tabelrijnummers te krijgen met
SELECT FOUND_ROWS();
die het juiste tabelrijtotaal van de vorige in de cache opgeslagen query retourneert.