sql >> Database >  >> RDS >> Mysql

Waarom is het geschatte aantal rijen heel anders in phpmyadmin-resultaten?

In tegenstelling tot MyISAM-tabellen houden InnoDB-tabellen niet bij hoeveel rijen de tabel bevat.

Daarom is de enige manier om het exacte aantal rijen in een InnoDB-tabel te weten, door elke rij in de tabel te inspecteren en een telling te verzamelen. Daarom, op grote InnoDB-tabellen, het uitvoeren van een SELECT COUNT(*) FROM innodb_table query kan erg traag zijn omdat het een volledige tabelscan uitvoert om het aantal rijen te krijgen.

phpMyAdmin gebruikt een zoekopdracht zoals SHOW TABLE STATUS om een ​​geschatte telling van het aantal rijen in de tabel van de engine (InnoDB) te krijgen. Omdat het slechts een schatting is, varieert het elke keer dat je het belt, soms kunnen de variaties behoorlijk groot zijn en soms zijn ze dichtbij.

Hier is een informatieve blogpost over COUNT(*) voor InnoDB-tabellen door Percona.

De MySQL-handleiding voor TOEN TABELSTATUS staten:

Het aantal rijen. Sommige opslagengines, zoals MyISAM, slaan het exacte aantal op. Voor andere storage-engines, zoals InnoDB, is deze waarde een benadering en kan deze wel 40 tot 50% afwijken van de werkelijke waarde. Gebruik in dergelijke gevallen SELECT COUNT(*) om een ​​nauwkeurige telling te verkrijgen.

De pagina over InnoDB-beperkingen gaat wat meer in detail:

TOON TABELSTATUS geeft geen nauwkeurige statistieken over InnoDB-tabellen, behalve de fysieke grootte die door de tabel is gereserveerd. Het aantal rijen is slechts een ruwe schatting die wordt gebruikt bij SQL-optimalisatie.

InnoDB houdt geen interne telling van rijen in een tabel bij omdat gelijktijdige transacties verschillende aantallen rijen tegelijkertijd kunnen "zien". Om een ​​SELECT COUNT(*) FROM t . te verwerken statement, InnoDB scant de index van de tabel, wat enige tijd in beslag neemt als de index zich niet volledig in de bufferpool bevindt. Als uw tabel niet vaak verandert, is het gebruik van de MySQL-querycache een goede oplossing. Om een ​​snelle telling te krijgen, moet u een tellertabel gebruiken die u zelf maakt en uw toepassing deze laten bijwerken volgens de invoegingen en verwijderingen. Als een geschat aantal rijen voldoende is, SHOW TABLE STATUS kan worden gebruikt.Zie Paragraaf 14.3.14.1, "InnoDB-prestaties Afstemtips” .



  1. AlwaysOn-beschikbaarheidsgroepen configureren - deel 2

  2. Opgeslagen procedure of functie verwacht een parameter die niet is opgegeven

  3. SQL-serverquery om de lijst met kolommen in een tabel te krijgen, samen met gegevenstypen, NOT NULL en PRIMARY KEY-beperkingen

  4. Nieuwe tabellen maken in IRI Workbench