Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Szybkie liczenie wierszy
Forum PHP.pl > Forum > Przedszkole
mastermindssj2
Pracuję nad dość obszerną bazą danych i potrzebuje choć w pewnym stopniu skrócić czas zapytań. Chodzi konkretnie o liczenie ilości zwróconych rekordów. W kilku miejscach wyczytałem, że SQL_CALC_FOUND_ROWS jest szybsze niż COUNT(). Z testów przeprowadzonych przeze mnie wynika co innego, COUNT() jest szybsze. Czy mógłby mi ktoś powiedzieć co robię nie tak? Czy możliwą przyczyną jest np zła konfiguracja bazy danych lub serwera?

Oto kod testu:
  1. //COUNT()
  2. $start = mktime()+microtime();
  3. $result = mysql_query("SELECT *, COUNT(*) from words");
  4. $result = mysql_fetch_assoc($result);
  5. $result = $result['COUNT(*)'];
  6. $end = mktime()+microtime();
  7. $time = $end-$start;
  8. echo "$result rekordów w <b>$time</b>s<hr/>";
  9.  
  10. //SQL_CALC_FOUND_ROWS
  11. $start = mktime()+microtime();
  12. $result = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM words");
  13. $result = mysql_query("SELECT FOUND_ROWS()");
  14. $result = mysql_fetch_assoc($result);
  15. $result = $result['FOUND_ROWS()'];
  16. $end = mktime()+microtime();
  17. $time = $end-$start;
  18. echo "$result rekordów w <b>$time</b>s<hr/>";


skrypt zwraca przykładowo taki wynik:
25041 rekordów w 0.059356918334961s
25041 rekordów w 0.087986965179443s

Za każdym razem COUNT() jest szybsze, nie raz dwukrotnie. Words to prosta tabela składająca się tylko z dwóch pól id i word. Z góry dziękuję za pomoc
Sephirus
Po primo źle do tego podszedłeś

  1. $result = mysql_query("SELECT *, COUNT(*) from words");


To rozbij na dwa zapytania...


Po secundo

Czas potrzebny na pobranie wyników oraz ich liczby może wychodzić różnie dla obu przypadków. Pamiętaj, że w przypadku użycia COUNT masz dwa czasy
- T1 czas pobrania rekordów (SELECT *...)
- T2 czas liczenia rekordów (SELECT COUNT(*) ...)

T1 powinien być oczywiście większy od T2.

W przypadku użycia SQL_CALC_FOUND_ROWS sytuacja wygląda nieco inaczej
- T3 czas pobrania rekordów oraz kalkulowania liczby wyników
- T4 czas pobrania liczby wyników

T3 będzie zawsze większy od T1 a T4 pomijalny. Grunt aby T3 < T1+T2 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.