Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] kilka count(*)
Forum PHP.pl > Forum > Przedszkole
rangoo
Witam.

Mam tabelę kategorii i firm. Mam zamiar jednym zapytaniem pobrać ilość firm dla każdej kategorii... Kodem:
  1. $x = mysql_query('SELECT count(*) as c FROM firmy');
  2. $x = $x['c'];

pobiorę ilość wszystkich firm... ale jak je pobrać dzieląc na kategorie?

Struktura kategorii:
id | parentID | name

Z góry dzięki smile.gif
piotrooo89
a jaką masz relacje firma<>kategoria?
nospor
musisz dodac GROUP BY polezkategoria
#luq
i nie rób
  1. COUNT(*)

a
  1. COUNT(someField)

to optymalniejsze
rangoo
Relacja jest prosta: pole kategoria w tabeli firm odnosi się do id kategorii wink.gif Wielkie dzięki za pomoc wink.gif
piotrooo89
to musisz zrobić tak jak podał ~nospor.
wmatusiak
Cytat(#luq @ 28.03.2011, 13:40:06 ) *
i nie rób
  1. COUNT(*)

a
  1. COUNT(someField)

to optymalniejsze

Ahh sory że się tak od startu wymądrzam ale pozwolę się nie zgodzić wink.gif
1. Te dwie składnie działają inaczej jeśli kolumna zawiera NULL'e
2. Akurat to COUNT(*) jest szybsze jeśli korzystasz z myisam w przeciwnym wypadku prawdopodobnie niema różnicy

Na poparcie moich twierdzeń mysql doc
#luq
Test na tablecie ~900 rekordów InnoDB

  1. mysql> SELECT benchmark( 100000000, 'select count(userId) from user' );

Powtórzone 10 razy po sobie, średnia wyników: 1,07 s (userId jest oczywiście kluczem podstawowym)

  1. mysql> SELECT benchmark( 100000000, 'select count(*) from user' );

Powtórzone 10 razy po sobie, średnia wyników: 1,31 s

Jeśli dodam do tego LEFT JOINa wyniki są zbliżone do siebie

Test na tabelce MyISAM ~150 rekordów wykazał zbliżone wyniki.

Ale na InnoDB działa wyraźnie szybciej wink.gif Dokładniej o 18,32% szybciej.
wmatusiak
Cytat(#luq @ 28.03.2011, 23:06:11 ) *
(userId jest oczywiście kluczem podstawowym).


O i tutaj się zgodzę że będzie szybciej ale tylko dlatego że policzy po indeksie wink.gif
Jednak ciężko się zgodzić z COUNT(fieldName) bo jak wstawiem tam kolumnę bez indeksu to nie będzie szybciej wink.gif a jeszcze jak może zawierać NULL to dochodzi kolejny warunek wink.gif
#luq
Z name które nie jest żadnym indexem
  1. mysql> SELECT benchmark( 100000000, 'select count(name) from user' );

10 razy - średni wynik 1,11 s wink.gif

Chodź oczywiście, osobiście zawszę to robię po kluczu podstawowym.
wmatusiak
Sprawdziłem twoje benchmark dla ~1100000 wierszy wink.gif
i daje ~1,30 z COUNT(id) i COUNT(*) więc dla mnie bez znaczenie nie zauważyłem różnicy pewnie dlatego ze rzadko pracuje z takimi małymi tabelami wink.gif
niestety benchmark nie działa poprawnie z SELECT w mojej wersji MySQL'a
puściłem 10x zapytanie z SQL_NO_CACHE i dla COUNT(*) mam średnio 1.60 a dla COUNT(id) mam 1.80.
Jak widać to nie takie oczywiste.
Generalnie w teorii COUNT(*) powinno być szybsze bo ma mnie operacji do wykonania.
Dodatkowo podkreślam że jeśli kolumna może mieć wartości NULL to nie zawsze COUNT(*) = COUNT(kolumna).

Dobra bo straszny OT się zrobił wink.gif Jestem przeciwny SELECT * ale SELECT COUNT(*) jeśli trzeba zwrócić tylko liczbę wierszy moim zdaniem jest ok wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.