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 http://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.