Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja zapytania SQL z funkcja COUNT ?
luckyluc
post
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 11.04.2006

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


Witam, mam problem z zapytaniem SQL. Stworzyłem do systemu newsow komentarze. Na stronie głównej przy każdym newsie licznik pokazuje ile jest komentarzy dla danego newsa. Komentarzy jest jak dużo, że przeliczenie tego obciąża serwer w takim stopniu, że destabilizuje jego prace. Poniżej wklejam zapytanie:


SELECT SQL_CALC_FOUND_ROWS newsy_id,newsy_data,newsy_czas,newsy_licznik,newsy_tytul,newsy_tekstskrocony,new
sy_tekstrozszerzony,newsy_foto,fotosy_file,dzialy_nazwa,COUNT(komentarze_id) licznik FROM newsy LEFT JOIN fotosy ON (fotosy_id=newsy_foto) LEFT JOIN dzialy ON (dzialy_id=newsy_dzial) LEFT JOIN komentarze ON (komentarze_news = newsy_id AND komentarze_status = '1') WHERE newsy_status='1' GROUP BY newsy_id ORDER BY newsy_data DESC, newsy_czas DESC LIMIT 0, 25


Będę wdzięczny za uwagi.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
wry
post
Post #2





Grupa: Zarejestrowani
Postów: 32
Pomógł: 3
Dołączył: 9.06.2007

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


mysle ze te 3 joiny w zapytaniu robia swoje, samo liczenie moglbys zorganizowac w osobnym zapytaniu wykonujac count po kolumnie na ktorej masz zalozony index (np po auto increment'owanym id) a jesli ciagle bedzie za wolno to cache'uj to zapytanie i powiedzmy raz na godzine usuwaj cache tak zeby trzymac w miare aktualne dane
Go to the top of the page
+Quote Post
Riklaunim
post
Post #3





Grupa: Zarejestrowani
Postów: 640
Pomógł: 44
Dołączył: 8.02.2004

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


Baza danych nie jest kalkulatorem i jak będziesz miał dużo rekordów to zwykły COUNT będzie wolny. Rozwiązanie tego to denormalizacja licznika. Ilość komentarzy zapisujesz w tabeli newsa i inkrementujesz go przy dodaniu komentarza. Wyświetlając listę newsów nie musisz wtedy liczyć newsów na żywo.
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Wydaje mi się, że zastosowanie w tym momencie podzapytania może okazać się wydajniejsze. Nie budujesz bowiem wielkiego złączenia tabel (w momencie, gdy do newsa jest wiele komentarzy) z grupowaniem:
  1. SELECT SQL_CALC_FOUND_ROWS newsy_id,newsy_data,newsy_czas,newsy_licznik,newsy_tytul,newsy_tekstskrocony,newsy_tekstrozszerzony,newsy_foto,fotosy_file,dzialy_nazwa,
  2.  
  3. -- Podzapytanie
  4. (SELECT COUNT(komentarze_id) FROM komentarze WHERE komentarze.komentarze_news = newsy.newsy_id AND komentarze.komentarze_status = '1') AS licznik
  5. --
  6.  
  7. FROM newsy LEFT JOIN fotosy ON (fotosy_id=newsy_foto) LEFT JOIN dzialy ON (dzialy_id=newsy_dzial) WHERE newsy_status='1' ORDER BY newsy_data DESC, newsy_czas DESC LIMIT 0, 25

Jeśli się nie machnąłem to powinno działać. Daj znać jak wyglądają czasy wykonań obu zapytań.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.09.2025 - 06:47