Policz wiersze tabeli

165

Jaka jest komenda MySQL, aby pobrać liczbę rekordów w tabeli?

DJ.
źródło

Odpowiedzi:

236
SELECT COUNT(*) FROM fooTable;

policzy liczbę wierszy w tabeli.

Zobacz instrukcję obsługi .

Gregory Pakosz
źródło
7
Czy jest to szybsze, gdy zamiast * używam nazwy indeksowanej kolumny? W ten sposób: WYBIERZ LICZNIK (identyfikator) Ztablename
1
Tylko nieznacznie. Otrzymałem tabelę wierszy 21961904, do której jego COUNT zapytał w 115 sekund, podczas gdy użycie ID zajęło 107 sekund.
Bondolin
2
COUNT (*) to ścisła definicja języka. Otrzymasz błąd analizy, jeśli spróbujesz COUNT (*) zwróć uwagę na spację
ppostma1
9
Dasz radę COUNT(1), to będzie najszybszy sposób.
Shota Papiashvili
Jaki jest najlepszy sposób użycia COUNT () do napisania zmiennej w PHP? Czy robię „... COUNT (*) AS rowCount ...” w SQL, czy używa on $ results-> num_rows, czy też istnieje sposób bezpośredniego wywołania tego wyniku?
Nosajimiki
71

Ponieważ nikt o tym nie wspomniał:

show table status;

zawiera listę wszystkich tabel wraz z dodatkowymi informacjami, w tym szacunkowymi wierszami dla każdej tabeli. To jest to, czego phpMyAdmin używa na swojej stronie bazy danych.

Te informacje są dostępne w MySQL 4, prawdopodobnie również w MySQL 3.23 - dawno temu w bazie danych schematu informacji.

AKTUALIZACJA:

Ponieważ głosowanie odrzucono, chcę wyjaśnić, że pokazana liczba jest szacunkowa dla InnoDB i TokuDB i jest absolutnie poprawna dla silników pamięci masowej MyISAM i Aria (Maria).

Zgodnie z dokumentacją :

Liczba rzędów. Niektóre mechanizmy przechowywania danych, 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 polecenia SELECT COUNT (*), aby uzyskać dokładną liczbę.

Jest to również najszybszy sposób na sprawdzenie liczby wierszy w MySQL, ponieważ zapytanie takie jak:

select count(*) from table;

Wykonywanie pełnego skanowania tabeli może być bardzo kosztowną operacją, która może zająć wiele godzin na dużym serwerze o dużym obciążeniu. Zwiększa również I / O dysku.

Ta sama operacja może zablokować tabelę dla wstawień i aktualizacji - dzieje się tak tylko w egzotycznych silnikach pamięci masowej.

InnoDB i TokuDB działają poprawnie z blokadą tabeli, ale wymagają pełnego skanowania tabeli.

Nacięcie
źródło
3
Wygląda na to, że jest to najbardziej efektywny sposób liczenia wierszy. Zastanawiam się, dlaczego to nie jest odpowiedź? Używam InnoDB. Z blokadą tabeli liczba wierszy powinna być dokładna, prawda?
Chung Lun Yuen
dla innodb szacuje się . ale możesz go użyć w niektórych przypadkach „Nasza witryna ma xxx członków”, „Wykryliśmy xxx wyników podobnych do Twojego” i tak dalej.
Nick
Nie jestem pewien. ale dla Innodb to nie jest prawdziwa liczba. Ale jest całkiem przydatne w przypadku tabel z milionem wierszy.
Nick
4
Przeglądanie tabel w celu policzenia każdego wiersza w celu uzyskania liczby wierszy jest raczej śmieszne. Dlatego też wolę tę odpowiedź.
th3penguinwhisperer
35

Mamy inny sposób sprawdzenia liczby wierszy w tabeli bez uruchamiania selectzapytania w tej tabeli.

Każda instancja MySQL ma bazę danych information_schema. Jeśli uruchomisz następujące zapytanie, poda ono pełne szczegóły dotyczące tabeli, w tym przybliżoną liczbę wierszy w tej tabeli.

select * from information_schema.TABLES where table_name = 'table_name'\G
Santhosh Tangudu
źródło
Czy jest to również szybsze w tabeli MyISAM, ponieważ MyISAM przechowuje liczbę wierszy?
NaturalBornCamper
Nigdy nie testowałem tego w MyISAM.
Santhosh Tangudu
6

Po prostu:

SELECT COUNT(*) FROM `tablename`
David Snabel-Caunt
źródło
5
select count(*) from YourTable
Adriaan Stander
źródło
3

Po prostu zrób

SELECT COUNT(*) FROM table;

Możesz określić warunki za pomocą Where po tym

SELECT COUNT(*) FROM table WHERE eye_color='brown';
Suanbit
źródło
3

Jeśli masz kilka pól w swojej tabeli, a Twoja tabela jest ogromna, lepiej NIE UŻYWAĆ, * ponieważ załaduj wszystkie pola do pamięci, a użycie poniższych da lepszą wydajność

SELECT COUNT(1) FROM fooTable;
Yuseferi
źródło
To jest niepoprawne. Zobacz stackoverflow.com/questions/5179969/… COUNT (1) może być w rzeczywistości znacznie wolniejszy dla MyISAM.
jcoffland
@jcoffland możesz spróbować samemu, zwłaszcza gdy masz połączenie lub gdy warunki są znacznie szybsze niż count (*).
Yuseferi
2

Jak wspomniał Santosh , myślę, że to zapytanie jest odpowiednio szybkie, bez przeszukiwania całej tabeli.

Aby zwrócić wynik całkowity liczby rekordów danych dla określonej nazwy tabeli w określonej bazie danych :

select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
AND table_name='tablename';
Mohammad Kanan
źródło
1
Może to zwrócić szacunkową liczbę wierszy. W jednym przykładzie otrzymałem 55 940 343 wierszy przy użyciu COUNT (*), ale 56 163 339 przy użyciu tej metody, więc było ono wyłączone o ponad 200 tys.
jcoffland
@jcoffland, wspomniałem o odpowiedzi _ Santosha_ powyżej, która stwierdza, że ​​wynik jest przybliżony . Moja odpowiedź to bardziej szczegółowe, praktyczne pytanie. Jest całkiem jasne, jeśli chodzi o odpowiedzi, jeśli chcesz precyzyjnie zliczać count(*)ze świadomością wydajności
Mohammad Kanan,
1
$sql="SELECT count(*) as toplam FROM wp_postmeta WHERE meta_key='ICERIK' AND post_id=".$id;
$total = 0;
$sqls = mysql_query($sql,$conn);
if ( $sqls ) {
    $total = mysql_result($sqls, 0);
};
echo "Total:".$total;`
alpc
źródło
Ta odpowiedź jest nieaktualna, mysql_result jest przestarzała w PHP 5.5.0 i usunięta w PHP 7.0.0
Uczyń ten świat lepszym miejscem
1

Musisz użyć funkcji count (), która zwraca liczbę wierszy spełniających określone kryteria

select count(*) from table_name;
zrazy
źródło
0

Jeśli masz klucz podstawowy lub unikalny klucz / indeks, szybsza możliwa metoda (przetestowana z 4 milionami tabel wierszy)

SHOW INDEXES FROM "database.tablename" WHERE Key_Name=\"PRIMARY\"

a następnie uzyskaj pole liczności (jest bliskie natychmiastowej)

Czasy, w których od 0,4 s do 0,0001 ms

hamboy75
źródło