adamantd
14.02.2013, 14:13:16
Witam!
Sprawa dotyczy dobrych praktyk projektowania połączeń bazodanowych -jeśli mogę to tak nazwać, mianowicie zastanawia mnie jak wiele połączeń z bazą danych na jednej stronie mają strony typu forum, portal społecznościowy (np randkowy) itp. Szukałem na ten temat informacji i znalazłem jedynie wypowiedź jakiegoś chłopaczka, że stara się on nie przekraczać 10 połączeń z bazą na jednej stronie. Nie sprecyzował jednak czy ma na myśli stronę typu wizytówka firmy czy średniej wielkości portal społecznościowy lub forum. Za to ktoś inny mu odpisał, że najprostsze fora to co najmniej 15 połączeń z bazą na jedną stronę (lista tematów, zdjęcia userów itp.).
Moje pytanie brzmi czy wg Was 20 do 30 połączeń z bazą danych na niewielkim portalu społecznościowym to zbyt dużo zwłaszcza jeśli chodzi o stronę główną, gdzie wyświetlane są np. przykładowe lub ostatnie rekordy z różnych tabel? Staram się tak pisać kod aby SELECT był przed pętlą, w pętli ułożenie zapytania dla klauzuli IN() na podstawie wyników pierwszego selecta i po za pętlą kolejny już właściwy SELECT. Ale jednak nie wszystko da się zrobić po za pętlą ponieważ zapytania często są zbyt zróżnicowane i kiedy zapętlę jedno czy dwa zapytania to nagle połączeń robi się np ze 30.
sowiq
14.02.2013, 14:20:43
To ja może doprecyzuję na początek. Oczywiście chodziło Ci o zapytania, a nie połączenia, prawda?
Prawda jest taka, że im większa i popularniejsza strona, tym bardziej trzeba się skupiać na cache'owaniu i optymalizacji ilości zapytań. Jeśli masz bloga, który ma 100 odsłon dziennie, to możesz robić 50 zapytań na stronę (czyli ~5k dziennie) i nic wielkiego się nie stanie.
Jeśli natomiast jest to większa strona, załóżmy z 20k odsłon dziennie, to każde dodatkowe zapytanie mnożone jest razy 20 000, więc trzeba się skupić na lepszej optymalizacji i cache'owaniu, które zmniejszy ich ilość do minimum.
mstraczkowski
14.02.2013, 14:21:28
Nie mylmy ilości połączeń z bazą danych z ilością wykonanych zapytań na stronie.
Połączenie powinno być wykonywane raz na stronę (Chyba, że aplikacja korzysta z kilku baz danych)
Zasada jest prosta, im mniej jest obciążana baza danych tym lepiej.
Dla przykładu pewien dosyć popularny portal z filmikami / obrazkami / gifami (Sadistic.pl)
Informuje w stopce o ilości wykonanych zapytań, jest to około 3-5 na stronę.
adamantd
14.02.2013, 14:27:51
Rozumiem, chodziło mi oczywiście o ilość zapytań, w takim razie będę musiał trochę poprzerabiać w klasie odpowiedzialnej za połączenie z bazą, ponieważ na ten moment jest tak skonstruowana, że po każdym zapytaniu zamyka połączenie a to znaczy, że jeżeli mam 30 zapytań na stronę to mam również 30 połączeń i 30 razy jest zamykane połączenie -zdaje się, że nie jest to najlepsze rozwiązanie (choć gdzieś kiedyś przeczytałem, że bezpieczniejsze). Teraz nie wiem co o tym myśleć (sporo przerabiania)
edit:
zaraz to jeszcze przetestuję
po szybkim teście:
21 połączeń z bazą danych na stronie głównej (strona główna jest w fazie budowy i już na ten moment ma tyle połączeń)
mstraczkowski
14.02.2013, 14:31:38
Ojojoj, to nie jest dobre rozwiązanie.
Tak jak mówiłem, połączenie powinno być jedno (ew. więcej jeżeli aplikacja korzysta z kilku baz danych)
adamantd
14.02.2013, 14:52:50
Czyli jeżeli poprzerabiam wszystko tak, żeby pierwsze zapytanie na stronie otwierało połączenie a ostatnie zapytanie zamykało to powinno być lepiej? Wtedy rozumiem, że nie powinno być problemem 20 zapytań do bazy na stronę przy jednym połączeniu?
sowiq
14.02.2013, 15:05:38
Jedno połączenie będzie zdecydowanie lepsze niż kilka otwieranych i zamykanych w ramach jednego requestu.
Cytat
Wtedy rozumiem, że nie powinno być problemem 20 zapytań do bazy na stronę przy jednym połączeniu?
Zobacz co napisałem na temat ilości zapytań w odniesieniu do odwiedzin strony.
adamantd
14.02.2013, 15:13:42
Ok wszytko już rozumiem -czeka mnie zatem wiele przerabiania. Dzięki za odpowiedzi
mstraczkowski
14.02.2013, 15:30:56
PHP domyślnie zamyka połączenie po zakończeniu skryptu.
Wystarczy je otworzyć przy pierwszym zapytaniu w twoim przypadku
viking
14.02.2013, 15:36:29
A dodatkowo warto przerobić temat "Lazy Database Connection"
adamantd
14.02.2013, 15:55:18
Udało się na ten moment uzyskać wynik:
17 zapytań
1 połączenie
na stronie głównej

mstraczkowski -czyli zgodnie z tym co napisałeś nie muszę na końcu skryptu zamykać połączenia, ponieważ ono i tak zostanie zamknięte samoistnie? Kiedy zatem powinno się używać mysqli_close() ? Jeżeli w jednym skrypcie chcę zamknąć połączenie z jedną bazą a otworzyć z jakąś inną oraz przypisać uchwyt połączenia do tej samej zmiennej?
mstraczkowski
14.02.2013, 16:52:32
Tak, PHP sam sobie zamknie to połączenie po zakończeniu skryptu.
Przykładowo wspomniane
mysql_close można użyć do zerwania połączenia w takiej sytuacji:
(Poniższe zdania są czysto hipotetyczne)
Założenia:Nasza aplikacja korzysta ogólnie z jednej bazy danych, lecz przykładowo przechowuje swoje ustawienia w drugiej bazie danych.
Rozwiązanie:Łączymy się z pierwszą bazą danych
Łączymy się z drugą bazą danych
Pobieramy ustawienia z drugiej bazy
(Teraz druga baza nie jest już nam potrzebna więc połączenie z nią możemy zakończyć)
Korzystamy już tylko z pierwszej bazy danych
Ciekawostka:Generalnie rzecz biorąc na dzień dzisiejszy nie powinno się już korzystać z funkcji
mysql_, zostały zdeprecjonowane wraz z pojawieniem się PHP 5.5.0, w przyszłości rozszerzenie
mysql_ zostanie usunięte.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.