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

Hvorfor er det estimerede antal rækker meget forskellige i phpmyadmin-resultater?

I modsætning til MyISAM-tabeller holder InnoDB-tabeller ikke styr på, hvor mange rækker tabellen indeholder.

På grund af dette er den eneste måde at kende det nøjagtige antal rækker i en InnoDB-tabel på at inspicere hver række i tabellen og akkumulere et antal. Derfor udfører man på store InnoDB-tabeller en SELECT COUNT(*) FROM innodb_table forespørgslen kan være meget langsom, fordi den laver en fuld tabelscanning for at få antallet af rækker.

phpMyAdmin bruger en forespørgsel som SHOW TABLE STATUS for at få en estimeret optælling af antallet af rækker i tabellen fra motoren (InnoDB). Da det kun er et skøn, varierer det hver gang du kalder det, nogle gange kan variationerne være ret store, og nogle gange er de tæt på.

Her er et informativt blogindlæg om COUNT(*) for InnoDB-tabeller af Percona.

MySQL-manualsiden til VIS TABELSTATUS siger:

Antallet af rækker. Nogle lagringsmotorer, såsom MyISAM, gemmer det nøjagtige antal. For andre lagringsmotorer, såsom InnoDB, er denne værdi en tilnærmelse og kan variere fra den faktiske værdi med så meget som 40 til 50 %. I sådanne tilfælde skal du bruge SELECT COUNT(*) for at få en nøjagtig optælling.

Siden om InnoDB-begrænsninger går i flere detaljer:

VIS TABELSTATUS giver ikke nøjagtig statistik om InnoDB-tabeller, bortset fra den fysiske størrelse, der er reserveret af tabellen. Rækketallet er kun et groft estimat, der bruges i SQL-optimering.

InnoDB fører ikke et internt antal rækker i en tabel, fordi samtidige transaktioner kan "se" forskellige antal rækker på samme tid. For at behandle en SELECT COUNT(*) FROM t sætning, InnoDB scanner indekset af tabellen, hvilket tager noget tid, hvis indekset ikke er helt i bufferpuljen. Hvis din tabel ikke ændrer sig ofte, er det en god løsning at bruge MySQL-forespørgselscachen. For at få en hurtig optælling, skal du bruge en tællertabel, du selv opretter, og lade din applikation opdatere den i henhold til de indsæt og sletter, den gør. Hvis et omtrentligt rækkeantal er tilstrækkeligt, SHOW TABLE STATUS kan bruges. Se afsnit 14.3.14.1, “InnoDB Performance Tuning Tips" .



  1. SQL Server Lock Escalation

  2. Automatisk stigning efter sletning i MySQL

  3. Hvordan kan jeg dekryptere en adgangskodehash i PHP?

  4. Sådan fungerer FROM_BASE64()-funktionen i MySQL