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
 
Start new topic
Odpowiedzi
Athlan
post 30.06.2007, 12:27:00
Post #2





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Przeprowadziłem testy, miałem do dyspozycji:
  • 10 000 notek
  • do każdej notki po 10 komentarzy, czyli 100 000
  • sumarycznie operowałem na 110 000 rekordach
Zapytanie ze sposobu nr 3, operacja z limitem na 1000 rekordów:
  1. SELECT n.*, COUNT(c.comment_id) AS count_comments FROM megatest_notes AS n
  2. LEFT JOIN megatest_comments AS c ON (c.comment_note = n.note_id)
  3. GROUP BY note_id
  4. LIMIT 0, 1000

Cytat
Pokaż rekordy 0 - 999 (1 000 wszystkich, Wykonanie zapytania trwało 0.0111 sekund(y))

Sposób 3 na 2000 rekordów:
Cytat
Pokaż rekordy 0 - 1999 (2 000 wszystkich, Wykonanie zapytania trwało 0.0216 sekund(y))

Sposób 3 na 5000 i 10000 rekordów: phpmyadmin zwraca pustą stronę.

Teraz przetestujemy sposób 1, wybierając id rekordów z notek (załóżmy, że jest to pole ilości komentarzy)

Sposób 1, 100 rekordów:
  1. SELECT note_id FROM `megatest_notes` LIMIT 0, 1000

Cytat
Pokaż rekordy 0 - 99 (100 wszystkich, Wykonanie zapytania trwało 0.0015 sekund(y))

Sposób 1, 500 rekordów:
phpmyadmin zwraca pustą stronę.

Wniosek? Chyba będę używał sposobu nr 3, bo nie przewiduję aż tak wielkiej bazy na jakiej testowałem moje przemyślenia.

Jak się do tego ustosunkujecie? Jakieś rady?

Dzięki za odpowiedzi, 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: 14.08.2025 - 13:59