W przeciwieństwie do tabel MyISAM, tabele InnoDB nie rejestrują liczby wierszy zawartych w tabeli.
Z tego powodu jedynym sposobem poznania dokładnej liczby wierszy w tabeli InnoDB jest sprawdzenie każdego wiersza w tabeli i zgromadzenie liczby. Dlatego w przypadku dużych tabel InnoDB wykonanie SELECT COUNT(*) FROM innodb_table
zapytanie może być bardzo powolne, ponieważ wykonuje pełne skanowanie tabeli, aby uzyskać liczbę wierszy.
phpMyAdmin używa zapytania takiego jak SHOW TABLE STATUS
aby uzyskać szacunkową liczbę wierszy w tabeli z silnika (InnoDB). Ponieważ jest to tylko szacunkowa wartość, zmienia się ona za każdym razem, gdy ją wywołasz, czasami różnice mogą być dość duże, a czasami są zbliżone.
Oto informacyjny post na blogu na temat COUNT(*) dla Tabele InnoDB przez Perconę.
Strona podręcznika MySQL dla POKAŻ STATUS TABELI stany:
Liczba rzędów. Niektóre aparaty pamięci masowej, takie jak MyISAM, przechowują dokładną liczbę. W przypadku innych silników pamięci masowej, takich jak InnoDB, ta wartość jest przybliżeniem i może różnić się od rzeczywistej wartości nawet o 40 do 50%. W takich przypadkach użyj SELECT COUNT(*), aby uzyskać dokładne zliczenie.
Strona dotycząca Ograniczenia InnoDB wchodzi w szczegóły:
SHOW TABLE STATUS nie podaje dokładnych statystyk dotyczących tabel InnoDB, z wyjątkiem fizycznego rozmiaru zarezerwowanego przez tabelę. Liczba wierszy jest tylko przybliżonym oszacowaniem używanym w optymalizacji SQL.
InnoDB nie przechowuje wewnętrznej liczby wierszy w tabeli, ponieważ współbieżne transakcje mogą „widzieć” różne liczby wierszy w tym samym czasie. Aby przetworzyć SELECT COUNT(*) FROM t
instrukcja, InnoDB skanuje indeks tabeli, co zajmuje trochę czasu, jeśli indeks nie znajduje się całkowicie w puli buforów. Jeśli Twoja tabela nie zmienia się często, dobrym rozwiązaniem jest użycie pamięci podręcznej zapytań MySQL. Aby uzyskać szybkie zliczanie, musisz użyć utworzonej przez siebie tabeli liczników i pozwolić aplikacji aktualizować ją zgodnie z wprowadzonymi i usuniętymi danymi. Jeśli przybliżona liczba wierszy jest wystarczająca, SHOW TABLE STATUS
można użyć.Patrz Sekcja 14.3.14.1, „Wydajność InnoDB Wskazówki dotyczące strojenia”
.