Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Szybkie liczenie wierszy
mastermindssj2
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 1
Dołączył: 21.06.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
redeemer
post
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


http://www.mysqlperformanceblog.com/2007/0...alc_found_rows/


--------------------
Go to the top of the page
+Quote Post
Sephirus
post
Post #3





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 18:06