![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 228 Pomógł: 7 Dołączył: 15.08.2012 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował adamantd 14.02.2013, 14:16:51 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował sowiq 14.02.2013, 14:21:37 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 273 Pomógł: 52 Dołączył: 3.02.2013 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
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ę. Ten post edytował mstraczkowski 14.02.2013, 14:26:28 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 228 Pomógł: 7 Dołączył: 15.08.2012 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
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ń) Ten post edytował adamantd 14.02.2013, 14:30:12 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 273 Pomógł: 52 Dołączył: 3.02.2013 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
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) Ten post edytował mstraczkowski 14.02.2013, 14:32:14 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 228 Pomógł: 7 Dołączył: 15.08.2012 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
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?
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 228 Pomógł: 7 Dołączył: 15.08.2012 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
Ok wszytko już rozumiem -czeka mnie zatem wiele przerabiania. Dzięki za odpowiedzi
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 273 Pomógł: 52 Dołączył: 3.02.2013 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
PHP domyślnie zamyka połączenie po zakończeniu skryptu.
Wystarczy je otworzyć przy pierwszym zapytaniu w twoim przypadku |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 6 381 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
A dodatkowo warto przerobić temat "Lazy Database Connection"
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 228 Pomógł: 7 Dołączył: 15.08.2012 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
Udało się na ten moment uzyskać wynik:
17 zapytań 1 połączenie na stronie głównej (IMG:style_emoticons/default/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? |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 273 Pomógł: 52 Dołączył: 3.02.2013 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował mstraczkowski 14.02.2013, 16:59:34 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 26.09.2025 - 02:36 |