Chcę w szybki sposób policzyć liczbę wierszy w mojej tabeli, która ma kilka milionów wierszy. Znalazłem post „ MySQL: najszybszy sposób na zliczanie liczby wierszy ” na Przepełnieniu stosu, który wyglądał, jakby to rozwiązało mój problem. Bayuah udzielił następującej odpowiedzi:
SELECT
table_rows "Rows Count"
FROM
information_schema.tables
WHERE
table_name="Table_Name"
AND
table_schema="Database_Name";
Który mi się podobał, ponieważ wygląda jak wyszukiwanie zamiast skanowania, więc powinien być szybki, ale postanowiłem go przetestować
SELECT COUNT(*) FROM table
aby zobaczyć, jaka była różnica w wydajności.
Niestety otrzymuję różne odpowiedzi, jak pokazano poniżej:
Pytanie
Dlaczego odpowiedzi różnią się o około 2 miliony wierszy? Zgaduję, że zapytanie, które wykonuje pełne skanowanie tabeli, jest dokładniejszą liczbą, ale czy istnieje sposób, aby uzyskać prawidłową liczbę bez konieczności uruchamiania tego powolnego zapytania?
Pobiegłem ANALYZE TABLE data_302
, co zakończyło się w 0,05 sekundy. Po ponownym uruchomieniu zapytania otrzymuję teraz znacznie bliższy wynik z 34384599 wierszy, ale wciąż nie jest to ta sama liczba, co select count(*)
z 34906061 wierszy. Czy tabela analizy jest natychmiast zwracana i przetwarzana w tle? Wydaje mi się, że warto wspomnieć, że jest to testowa baza danych i do tej pory nie jest zapisywana.
Nikt nie będzie się przejmował, czy to tylko kwestia powiedzenia komuś, jak duża jest tabela, ale chciałem przekazać liczbę wierszy do kawałka kodu, który użyłby tej liczby do utworzenia asynchronicznych zapytań o „równej wielkości” do zapytania do bazy danych równolegle, podobnie jak metoda pokazana w Zwiększanie wydajności powolnego zapytania przy równoległym wykonywaniu zapytania przez Alexandra Rubina. W tej chwili otrzymam najwyższy identyfikator SELECT id from table_name order by id DESC limit 1
i mam nadzieję, że moje tabele nie ulegną zbyt dużej fragmentacji.
NUM_ROWS
kolumnie