![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Dziś chciałbym podyskutować troszkę na temat optylamizacji zapytań do baz danych. Ostatnio mam problem z pobraniem ilości komentarzy przypisanych do listy notek na blogu, a że będzie to dość wielki system blogowy oferujący dobudowanie swojej cegiełki w Internecie, zależy mi na maksymalnej optymalizacji, dlatego poświece temu ten oto topick. Wracając do zliczania komentarzy. Mamy 3 sposoby: 1. Zapisywać ilość komentarzy (notes_comments = notes_comments + 1) przy każdym dodawaniu komentarza do notki, a przy usuwaniu odejmować tą wartość. 2. Zliczać ilość komentarzy zapytaniem, które przelatuje przez tabelą komentarzy licząc je i grupując wg ich ID, ale tylko te, które przynależą do notek wyświetlonych na liście, przykładowo:
Otrzymujemy tablicę: NOTKA => ILOŚĆ_KOMENTARZY, później możemy połączyć ją w PHP. 3. Dołączmy JOINA i countujemy komentarze przpisane do danej notki:
----------------------------------------------------------------------------------------- Wykonując sposób pierwszy, nie mamy doczynienia z żadnym liczeniem. Chciałbym trochę podyskutować na temat sposobu 2 i 3. Doszły mnie słuchy od @cichy'ego i od @hwao, że przy wielkiej ilości rekordów baza może trochę zamulać. Zadaje więc 2 pytania: Całe sedno sprawy
Zapraszam do dyskusji (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Athlan (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
@SongoQ, dzięki za wypowiedź
Dobrze, że zwróciłeś uwagę na indeksy, to akurat robie już przy samym projektowaniu bazy obmyślając każdy przypadek użycia jakiegokolwiek z pól w ewentualnych featurach. Indeksy mają duży wpływ na szybkość działania baz danych. Wracając już do mojego problemu. Razem z Bastion'em i Envp rozwiązałem ten problem w bardzo prosty sposób. Połączmy sposoby 1 i 3. Co nam to da? Nie liczymy rekordów za każdym razem, a zapisujemy je w polu. Dlaczego akurat tak? Załóżmy że zapytanie dodania komentarza nie wypaliło bo cośtam. Nawet jeśli sprawdzałbym, czy zapytanie się powiodło tutaj również mogło coś niewyaplić. Tak czy siak dodaje notes_comments_count = notes_comments_count + 1. Żle! Przy takiej akcji mogę wywołać metodę w modelu która podliczy ile faktycznie mam komentarzy przypisanych do tej notki i (jeżeli wartość się różni) zapisać wynik w pole notes_comments_count. Myślę, że jest to najlepsze wyjście, podkreślam kiedy warto go użyć: - przy dodawaniu newsa - edycji - usuwaniu - wszelkim zmianom statusu (aktywny/nieaktywny na stronie) Pozdrawiam i dzięki za dyskusję, Athlan (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 07:54 |