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:
<?php { $this->_connect(); $oDb = $this->getSource(); $sSql = ' SELECT `comment_blog_note` AS `note`, COUNT(`comment_id`) AS `comments` FROM `comments` GROUP BY `comment_blog_note`'; $rResult = $oDb->Execute($sSql); { $aComments[$aRow['note']][] = $aRow['comments']; } return $aComments; } ?>
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:
SELECT n.*, COUNT(c.comment_id) AS count_comments FROM notes AS n LEFT JOIN comments AS c ON (c.comment_blog_note = n.note_id) GROUP BY note_id 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
- Baza danych zacznie zamulać w przypadku dużej ilości rekordów przypisanych do notki?
- Baza danych zacznie zamulać w przypadku dużej ilości rekordów w tabeli komentarzy?
Zapraszam do dyskusji

