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

Dlaczego funkcja POKAŻ STATUS TABELI w innodb jest tak niewiarygodna?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Usługa MySQL57 na komputerze lokalnym została uruchomiona, a następnie zatrzymana

  2. Jak używać GROUP BY w zapytaniu podczas używania zmiennych

  3. Połączyć się z kontenerem Docker MySQL z hosta lokalnego?

  4. Czy można wywołać procedurę składowaną MySQL z Rubiego?

  5. Zwróć wartość logiczną z pliku PHP do pliku AJAX - przycisk Śledź