2012-10-11 15 views
5

Aby uzyskać całkowitą liczbę rekordów, Zwykle używam tej kwerendy:Które zapytań MySQL jest skuteczny, aby uzyskać całkowitą liczbę rekordów

$total= mysql_num_rows(mysql_query("SELECT id FROM t_statistic WHERE pageid = $pid")); 

ale mam jeden drugiego kwerendy jak poniżej:

$data = mysql_fetch_object(mysql_query("SELECT COUNT(id) AS num_rows FROM t_statistic WHERE pageid = $pid")); 
$total = $data->num_rows; 

Pomiędzy dwoma powyższymi zapytaniami. Który jest szybszy i skuteczniejszy (kiedy całkowita liczba rekordów w milionach)?

+0

oba zakładają, że zapytanie kwerendy się udało, a jeśli coś pójdzie źle, ulegnie awarii. zakładając, że praca z zapytaniami jest złym rozwiązaniem. –

+0

Możliwy duplikat http://stackoverflow.com/questions/2485224/sql-php-which-is-faster-mysql-num-rows-or-select-count – janenz00

Odpowiedz

5

Wolę drugie zapytanie. Daje już liczbę rekordów, podczas gdy pierwsza kwerenda podaje listę identyfikatorów (, a nie liczbę), chociaż została ona przefiltrowana, ale są pewne przypadki, gdy ID istnieje więcej niż jeden raz w tabeli.

0

Zdecydowanie drugi.

Niektóre silniki, takie jak MySQL, mogą liczyć tylko patrząc na indeks, a nie na dane tabeli.

Użyłem czegoś podobnego w bazach danych zawierających miliony rekordów.

SELECT count(*) as `number` FROM `table1`; 

O wiele szybciej niż: mysql_num_rows ($ res);

BTW: The * in Count (*) w zasadzie oznacza, że ​​nie będzie patrzył na dane, to po prostu policzy zapisy, w przeciwieństwie do Count (colname).

1

drugie zapytanie jest szybki i skuteczny:

SELECT COUNT (id) AS NUM_ROWS Z t_statistic GDZIE IdStrony = $ pid

Jeśli wiesz o optymalizacji zapytań. Zapytanie zachowuje tylko liczenie w pamięci podczas obliczania odpowiedzi. I bezpośrednio podaje liczbę rzędów.

Jeżeli jako pierwsza zapytania:

SELECT ID z t_statistic GDZIE IdStrony = $ PID

zachowuje wszystkie wybrane wierszy pamięci. wtedy liczba rzędów jest obliczana w dalszej operacji.

Tak więc zapytanie jest najlepsze w obie strony.

0
1) SELECT COUNT(*) FROM t_statistic WHERE pageid = $pid" --> count(*) counts all rows 

2)SELECT COUNT(id) FROM t_statistic WHERE pageid = $pid" --> COUNT(column) counts non-NULLs only 

3) SELECT COUNT(1) FROM t_statistic WHERE pageid = $pid" -->COUNT(1) is the same as COUNT(*) because 1 is a non-null expressions 

Your use of COUNT(*) or COUNT(column) should be based on the desired output only. 

Tak. Nareszcie mamy wynik to count (kolumna) jest szybszy w porównaniu do count (*).

Powiązane problemy