sql >> Databasteknik >  >> RDS >> Mysql

Varför är innodbs VISA TABELL STATUS så opålitlig?

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.



  1. Primära nycklar och index i Hive-frågespråk är möjligt eller inte?

  2. Python db-api:fetchone vs fetchmany vs fetchall

  3. Infoga, vid dubblettuppdatering i PostgreSQL?

  4. Hur man bibehåller ordningen för insättning i SQL Server