Oficjalna dokumentacja
MySQL 5.1 przyjmuje do wiadomości, że InnoDB nie podaje dokładnych statystyk za pomocą SHOW TABLE STATUS . Podczas gdy tabele MYISAM w szczególności przechowują wewnętrzną pamięć podręczną metadanych, takich jak liczba wierszy itp., silnik InnoDB przechowuje zarówno dane tabel, jak i indeksy w */var/lib/mysql/ibdata**
InnoDB nie ma odpowiedniego pliku indeksu umożliwiającego szybkie zapytanie o numery wierszy.
Niespójne numery wierszy tabeli są zgłaszane przez SHOW TABLE STATUS ponieważ InnoDB dynamicznie szacuje wartość „Rows”, próbkując zakres danych tabeli (w */var/lib/mysql/ibdata**), a następnie ekstrapoluje przybliżoną liczbę wierszy. Tak bardzo, że dokumentacja InnoDB potwierdza niedokładność numeru wiersza do 50% przy użyciu SHOW TABLE STATUS
Dokumentacja MySQL sugeruje użycie pamięci podręcznej zapytań MySQL w celu uzyskania spójnych zapytań o numery wierszy, ale dokumentacja nie określa jak . Poniżej znajduje się zwięzłe wyjaśnienie, jak można to zrobić.
Najpierw sprawdź, czy buforowanie zapytań jest włączone:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Jeśli wartość have_query_cache to NIE następnie włącz pamięć podręczną zapytań, dodając następujące wiersze do /etc/my.cnf a następnie uruchom ponownie mysqld.
have_query_cache=1 # added 2017 08 24 wh
query_cache_size = 1048576
query_cache_type = 1
query_cache_limit = 1048576
(więcej informacji znajdziesz na https://dev.mysql. com/doc/refman/5.1/en/query-cache.html )
Zapytaj o zawartość pamięci podręcznej za pomocą
mysql> SHOW STATUS LIKE 'Qcache%';
Teraz użyj SQL_CALC_FOUND_ROWS instrukcja w SELECT zapytanie:
SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS podejmie próbę odczytu z pamięci podręcznej, a jeśli to zapytanie nie zostanie znalezione, wykona zapytanie względem określonej tabeli, a następnie zatwierdzi liczbę wierszy tabeli w pamięci podręcznej zapytań. Dodatkowe wykonania powyższego zapytania (lub innego 'cachowalnego' SELECT oświadczenia - patrz poniżej) sprawdzi pamięć podręczną i zwróci poprawny wynik.
Kolejne "cache" SELECT zapytania
- nawet jeśli LIMIT wynik - sprawdzi pamięć podręczną zapytań i pozwoli Ci uzyskać (jednorazowo) całkowitą liczbę wierszy tabeli za pomocą
SELECT FOUND_ROWS();
który zwraca poprawną sumę wierszy tabeli poprzedniego buforowanego zapytania.