Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dyskusja: optymalizacja baz danych, Zliczanie rekordów z drugiej tabeli
Athlan
post 30.06.2007, 10:49:42
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:
  1. <?php
  2. public function getUsed(array $aNotes)
  3. {
  4. $this->_connect();
  5. $oDb = $this->getSource();
  6.  
  7. $sSql = '
  8. SELECT `comment_blog_note` AS `note`, COUNT(`comment_id`) AS `comments`
  9. FROM `comments`
  10. WHERE `comment_blog_note` = ' . implode(' OR `comment_blog_note` = ', $aNotes) . '
  11. GROUP BY `comment_blog_note`';
  12. $rResult = $oDb->Execute($sSql);
  13.  
  14. $aComments = array();
  15.  
  16. while($aRow = mysql_fetch_array($rResult))
  17. {
  18. if(!is_array($aUsedTags[$aRow['note']]))
  19.  $aUsedTags[$aRow['note']] = array();
  20.  
  21. $aComments[$aRow['note']][] = $aRow['comments'];
  22. }
  23.  
  24. return $aComments;
  25. }
  26. ?>

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:
  1. SELECT n.*, COUNT(c.comment_id) AS count_comments FROM notes AS n
  2. LEFT JOIN comments AS c ON (c.comment_blog_note = n.note_id)
  3. GROUP BY note_id
  4. ORDER BY note_time DESC


-----------------------------------------------------------------------------------------

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
  1. Baza danych zacznie zamulać w przypadku dużej ilości rekordów przypisanych do notki?
  2. Baza danych zacznie zamulać w przypadku dużej ilości rekordów w tabeli komentarzy?
Jak narazie jestem skłonny jak najbardziej do sposobu nr 1, ale chciałbym omówić dwa pozostałe.

Zapraszam do dyskusji smile.gif Athlan smile.gif


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post

Posty w temacie


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 Wersja Lo-Fi Aktualny czas: 24.07.2025 - 23:36