Den officiella MySQL 5.1 dokumentationen
bekräftar att InnoDB inte ger korrekt statistik med SHOW TABLE STATUS
. Medan MYISAM-tabeller specifikt håller en intern cache med metadata som antal rader etc, lagrar InnoDB-motorn både tabelldata och index i */var/lib/mysql/ibdata**
InnoDB har ingen lämplig indexfil som tillåter en snabb fråga efter radnummer.
Inkonsekventa tabellradnummer rapporteras av SHOW TABLE STATUS
eftersom InnoDB dynamiskt uppskattar "Rows"-värdet genom att sampla ett intervall av tabelldata (i */var/lib/mysql/ibdata**) och sedan extrapolerar det ungefärliga antalet rader. Så mycket att InnoDB-dokumentationen erkänner radnummerinexakthet på upp till 50 % när du använder SHOW TABLE STATUS
MySQL-dokumentationen föreslår att du använder MySQL-frågecachen för att få konsekventa radnummerfrågor, men dokumenten anger inte hur . En kortfattad förklaring av hur detta kan göras följer.
Kontrollera först att frågecache är aktiverat:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Om värdet för have_query_cache är NEJ aktivera sedan frågecachen genom att lägga till följande rader i /etc/my.cnf och starta sedan om mysqld.
have_query_cache=1 # added 2017 08 24 wh
query_cache_size = 1048576
query_cache_type = 1
query_cache_limit = 1048576
(för mer information se http://dev.mysql. com/doc/refman/5.1/en/query-cache.html )
Fråga innehållet i cachen med
mysql> SHOW STATUS LIKE 'Qcache%';
Använd nu SQL_CALC_FOUND_ROWS
uttalande i en SELECT
fråga:
SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS
kommer att försöka läsa från cacheminnet och, om den här frågan inte hittas, kör du frågan mot den angivna tabellen och skickar sedan antalet tabellrader till frågecachen. Ytterligare körningar av ovanstående fråga (eller annan "cachbar" SELECT
uttalanden - se nedan) kommer att konsultera cachen och returnera det korrekta resultatet.
Efterföljande 'cachable' SELECT
frågor
- även om de LIMIT
resultatet - kommer att konsultera frågecachen och låter dig få (endast en gång) det totala antalet tabellrader med
SELECT FOUND_ROWS();
som returnerar den föregående cachade frågans korrekta tabellradsumma.