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.