Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Maksymalna ilość połączeń z bazą na stronę
Forum PHP.pl > Forum > PHP
adamantd
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
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
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
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
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
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
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
Ok wszytko już rozumiem -czeka mnie zatem wiele przerabiania. Dzięki za odpowiedzi
mstraczkowski
PHP domyślnie zamyka połączenie po zakończeniu skryptu.
Wystarczy je otworzyć przy pierwszym zapytaniu w twoim przypadku
viking
A dodatkowo warto przerobić temat "Lazy Database Connection"
adamantd
Udało się na ten moment uzyskać wynik:
17 zapytań
1 połączenie

na stronie głównej smile.gif

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
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.