sql >> Databáze >  >> RDS >> Mysql

Proč se odhadovaný počet řádků ve výsledcích phpmyadmin velmi liší?

Na rozdíl od tabulek MyISAM tabulky InnoDB nesledují, kolik řádků tabulka obsahuje.

Z tohoto důvodu je jediným způsobem, jak zjistit přesný počet řádků v tabulce InnoDB, zkontrolovat každý řádek v tabulce a nashromáždit počet. Proto u velkých tabulek InnoDB provedení SELECT COUNT(*) FROM innodb_table dotaz může být velmi pomalý, protože provádí úplné prohledání tabulky, aby získal počet řádků.

phpMyAdmin používá dotaz jako SHOW TABLE STATUS získat odhadovaný počet řádků v tabulce z enginu (InnoDB). Protože je to jen odhad, mění se pokaždé, když to zavoláte, někdy mohou být odchylky poměrně velké a někdy jsou blízko.

Zde je informativní blogový příspěvek o COUNT(*) pro Tabulky InnoDB od Percona.

Manuální stránka MySQL pro ZOBRAZIT STAV TABULKY uvádí:

Počet řádků. Některé úložné stroje, jako je MyISAM, ukládají přesný počet. U jiných úložišť, jako je InnoDB, je tato hodnota přibližná a může se lišit od skutečné hodnoty až o 40 až 50 %. V takových případech použijte SELECT COUNT(*) k získání přesného počtu.

Stránka na Omezení InnoDB jde do některých podrobností:

SHOW TABLE STATUS neposkytuje přesné statistiky o tabulkách InnoDB, s výjimkou fyzické velikosti vyhrazené tabulkou. Počet řádků je pouze hrubý odhad používaný při optimalizaci SQL.

InnoDB neuchovává interní počet řádků v tabulce, protože souběžné transakce mohou „vidět“ různé počty řádků ve stejnou dobu. Pro zpracování SELECT COUNT(*) FROM t InnoDB skenuje index tabulky, což nějakou dobu trvá, pokud index není zcela ve fondu vyrovnávacích pamětí. Pokud se vaše tabulka často nemění, je použití mezipaměti dotazů MySQL dobrým řešením. Abyste dosáhli rychlého počítání, musíte použít tabulku počítadel, kterou si sami vytvoříte, a nechat aplikaci, aby ji aktualizovala podle vložení a odstranění. Pokud je přibližný počet řádků dostatečný, SHOW TABLE STATUS lze použít. Viz oddíl 14.3.14.1, „Výkon InnoDB Tipy pro ladění” .



  1. Bylo by možné při provádění PITR pozastavit/obnovit v PostgreSQL?

  2. Jak vymažete protokol transakcí SQL Server?

  3. Proč používat klauzuli JOIN oproti podmínce WHERE?

  4. Automatizované testování záloh PostgreSQL