Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego szacowana liczba wierszy jest bardzo różna w wynikach phpmyadmina?

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” .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wysyłanie wszystkich błędów PHP do bazy danych, a nie error_log

  2. Wskazówki dotyczące zapewniania wydajności bazy danych MySQL — część druga

  3. Jak uzyskać różnicę lat z dwóch różnych dat?

  4. Uzyskiwanie różnicy czasu między dwoma czasami w PHP

  5. Podstawowe porównanie administracyjne między Oracle, MSSQL, MySQL, PostgreSQL