Oszukać bazę danych ;-)

Zarządzając jakimś serwisem internetowym (np. katalog stron, forum) może się okazać, że serwis jest dość popularny i przekroczyliśmy limit połączeń z bazą danych. Wiadomo: administratorzy serwerów dbają o to, aby jakość usług była na najwyższym poziomie, dlatego są zmuszeni wprowadzić pewne limity (w przypadku serwerów współdzielonych z jednej maszyny korzysta kilkanaście-kilkadziesiąt użytkowników i nie może dojść do takiej sytuacji, że jeden użytkownik wykorzystuje zasoby maszyny w 100%). Jednym z takich limitów jest ilość zapytań wysłanych do bazy danych. Niestety, ale czasami owy limit może zostać przekroczony. Są różne sposoby rozwiązania tego problemu:

Najprostsze rozwiązanie to wykupienie dedykowanej maszyny pod nasz serwis. Jest to dobre rozwiązanie, gdyż nie trzeba się z nikim dzielić mocą obliczeniową, jednak jest to dość drogie rozwiązanie (koszt rzędu kilkuset złotych miesięcznie może odstraszyć właścicieli rozrastających się serwisów, które dopiero zaczęły generować zyski).

Innym rozwiązaniem może być optymalizacja skryptów, tj. sprawdzenie, czy pewne rzeczy można wykonać zadając mniejszą ilość zapytań do bazy danych.

Kolejne rozwiązanie to buforowanie danych. Jeśli są na stronie jakieś elementy, które są pobierane z bazy danych a dość rzadko się zmieniają, to można te dane zapisywać do tymczasowego pliku i przy generowaniu strony zamiast odczytywać je z bazy danych należy odczytywac z pliku. Oczywiście należy tutaj zadbać o to, aby owy tymczasowy plik był co jakiś czas aktualizowany a także trzeba pomyśleć o tym, aby owy plik był aktualizowany, gdy zmienią się kluczowe dane w bazie danych.

I najciekawsze rozwiazanie: na niektórych serwerach limit zapytań do bazy danych dotyczy użytkownika. Użytkownik to nic innego jak para: login i hasło, która może łączyć się z bazą danych. I na niektórych serwerach z danej bazy danych może korzystać kilku użytkowników. Tak więc jeśli limit np. 100000 zapytań do bazy danych w ciągu godziny zostaje przekroczony to można stworzyć drugiego użytkownika i przerobić skrypt tak, aby raz łączył się z bazą danych z jednym użytkownikiem a raz z drugim. Jest to jednak dość nieetyczne zastosowanie (wykorzystanie „luki” w celu ominięcia limitu). Z drugiej strony sam to czasami stosuję. Otóż czasami wykonuję pewne prace administracyjne (np. usuwam stare posty z forum, szukam martwych załączników). Prace administracyjne wykonuję dość rzadko (raz na tydzień) jednak wymagają one sporej ilości zapytań do bazy danych i czasami gdy zbyt intensywnie grzebałem, inni nie mogli korzystac z forum, gdyż przekraczałem limit zapytań. Problem rozwiązałem przerabiając skrypt tak, aby łączył się z bazą danych korzystając z innego użytkownika, gdy się loguję do panelu administracyjnego.

3 komentarze to “Oszukać bazę danych ;-)”

  1. Gość pisze:

    mam pytanie, czy zapytanie do bazy danych to każda operacja na niej? tzn SELECT, INSERT lub UPDATE?
    pozdrawiam, artykuł bardzo ładnie napisany 🙂

  2. Kamil Brenk pisze:

    Najlepszym sposobem jest przechowywanie wyników w plikach tymczasowych. Strony szybciej się wczytują, mniejsza ilość zapytań do bazy, całość do zaprojektowania wcale niezbyt ciężka – wystarczy jedna porządna klasa, których za darmo w Internecie też nie brakuje i jakoś można poradzić sobie z tym problemem. Pozdrawiam.