sql >> Database >  >> RDS >> Mysql

Waarom is de SHOW TABLE STATUS van innodb zo onbetrouwbaar?

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.



  1. Wat is de beste manier om html-code op te slaan in mysql?

  2. Getallen opmaken door opvulling met voorloopnullen in SQL Server

  3. Een deel van een string in SQL vervangen

  4. Mac + virtualenv + pip + postgresql =Fout:pg_config uitvoerbaar bestand niet gevonden