sql >> Database teknologi >  >> RDS >> Mysql

Hvorfor er innodbs VIS TABEL STATUS så upålidelig?

Den officielle MySQL 5.1 dokumentation anerkender, at InnoDB ikke giver nøjagtig statistik med SHOW TABLE STATUS . Mens MYISAM-tabeller specifikt holder en intern cache af metadata såsom antal rækker osv., gemmer InnoDB-motoren både tabeldata og indekser i */var/lib/mysql/ibdata**

InnoDB har ingen hensigtsmæssig indeksfil, der tillader en hurtig forespørgsel efter rækkenumre.

Inkonsistente tabelrækkenumre rapporteres af SHOW TABLE STATUS fordi InnoDB dynamisk estimerer 'Rows'-værdien ved at sample et område af tabeldataene (i */var/lib/mysql/ibdata**) og derefter ekstrapolerer det omtrentlige antal rækker. Så meget, at InnoDB-dokumentationen anerkender rækkenummerunøjagtighed på op til 50 %, når du bruger SHOW TABLE STATUS

MySQL-dokumentationen foreslår at bruge MySQL-forespørgselscachen til at få konsistente rækkenummerforespørgsler, men dokumenterne angiver ikke hvordan . En kortfattet forklaring på, hvordan dette kan gøres, følger.

Tjek først, at forespørgselscache er aktiveret:

mysql> SHOW VARIABLES LIKE 'have_query_cache';

Hvis værdien af ​​have_query_cache er NEJ aktiver derefter forespørgselscachen ved at tilføje følgende linjer til /etc/my.cnf og genstart derefter mysqld.

have_query_cache=1    # added 2017 08 24 wh
query_cache_size  = 1048576
query_cache_type  = 1
query_cache_limit = 1048576

(for mere information se http://dev.mysql. com/doc/refman/5.1/da/query-cache.html )

Forespørg på indholdet af cachen med

mysql> SHOW STATUS LIKE 'Qcache%';

Brug nu SQL_CALC_FOUND_ROWS sætning i en SELECT forespørgsel:

SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table

SQL_CALC_FOUND_ROWS vil forsøge at læse fra cache, og hvis denne forespørgsel ikke findes, skal du udføre forespørgslen mod den angivne tabel og derefter overføre antallet af tabelrækker til forespørgselscachen. Yderligere eksekveringer af ovenstående forespørgsel (eller anden 'cachbar' SELECT udsagn - se nedenfor) vil konsultere cachen og returnere det korrekte resultat.

Efterfølgende 'cachable' SELECT forespørgsler - også selvom de LIMIT resultatet - vil konsultere forespørgselscachen og tillade dig at få (kun én gang) de samlede tabelrækkenumre med

SELECT FOUND_ROWS();

som returnerer den forrige cachelagrede forespørgsels korrekte tabelrækketotal.



  1. Sådan konfigureres Tomcat til at oprette forbindelse til MySQL

  2. Pymysql Cursor.fetchall() / Fetchone() Returnerer ingen

  3. Sådan fungerer REGEXP_SUBSTR()-funktionen i MySQL

  4. Valg af en enkelt række i MySQL