sajborg
19.03.2007, 20:13:00
Witam. Mam problem mam duzo zapytan do sql czasami serwery są przeciążone. Pomyślałem nad cachowaniem sql. Powiedzmy ze jest to jakas wyszukiwarka. Jak najwydajniej i gdzie zapisac cachowane wyniki ? Pliki jesli tak to jak moze zapisywac w xml albo serializowac i zapisywac w takiej postaci, a moze cache zapisac takze w sql tylko to sie chyba mija z celem
em1X
19.03.2007, 20:34:05
Stworz klase-otoczke dla bazy danych, ktora bedzie cachowala wyniki zaserializowane w plikach. Z checia poznam wyniki testow
batman
19.03.2007, 20:35:49
Napiszę Ci jak ja mam to rozwiązane u siebie.
Mam stworzoną klasę, która zapisuje pliki o dowolnym rozszerzeniu. Dzięki tej klasie mam możliwość zbuforowania wszystkiego, od wyniku zapytania do bazy, do całych stron html.
Ale do rzeczy. Zapytania do bazy tak są skonstruowane, by nie zwracały więcej niż 20 wierszy - dzięki temu nie zaśmiecam pamięci danymi, których i tak najprawdopodobniej użytkownik nie zobaczy. Następnie dane te są zapisywane do pliku php w postaci tablicy, którą przy następnym wywołaniu zapytania sql zwracam zamiast odpytywać bazę danych. Każdy plik ma ustawiany "czas życia", po którym automatycznie jest kasowany (cron). Jeśli z jakieś przyczyny dane muszą być cały czas aktualne (np. ceny w sklepie internetowym), wówczas podczas modyfikacji danych, czyszczone są bufory (kasuję odpowiednie pliki).
sajborg
19.03.2007, 21:02:06
Batman to podobnie do mnie tez na klasie chce to zrobic tylko nie zapisywac w tablicach tylko zserializowane dane potem je odczytuje przeczytalem w necie ze sa lepsze rezultaty. Przy modyfikacji tez czyszcze bufor

Ale nie wiem czy to jest optymalne rozwiazanie
batman
19.03.2007, 22:23:03
Serializowanie danych jest mocno przereklamowane. Najlepszym przykładem jest serializowanie tablicy zawierającej polskie krzaczki oraz różne "dziwne" znaki (trade mark, copywrite, itp). Serializując takie "wygibasy" łatwo o błąd parsowania. By temu zapobiec trzeba przejechać ciąg base64, a to zwiększa długość ciągu o 1/3 oraz wymaga wykonania kolejnej funkcji.
sajborg
19.03.2007, 22:41:41
Czyli normalne tablice walic do pliku. Tak a jaka jest poprawa szybkosci w takim sposobie ?
batman
19.03.2007, 22:45:38
Nie miałem okazji sprawdzić na ile szybsze / wolniejsze jest to rozwiązanie, jednak na prosty chłopski rozum im mniej wykonasz funkcji, tym szybciej powinno to działać
Jarod
19.03.2007, 23:16:54
Cytat(batman @ 19.03.2007, 22:45:38 )

jednak na prosty chłopski rozum im mniej wykonasz funkcji, tym szybciej powinno to działać

Niekoniecznie. Np odczytanie zserializowanej tablicy może być szybsze niż zwykłej. Ale nie sprawdzałem więc teoretyzuję.
sajborg
20.03.2007, 21:43:12
A jest jakis inny sposob na cachowanie ? Moze wyniki tego tez trzymac sql nie wiem
Jarod
20.03.2007, 21:54:27
Cytat(paweb @ 20.03.2007, 21:43:12 )

A jest jakis inny sposob na cachowanie ? Moze wyniki tego tez trzymac sql nie wiem
Ja zapisuje do pliku. Moim zdaniem najlepsze rozwiązanie.
arecki
20.03.2007, 22:36:58
Może powiem tak: czekałem na taki wątek. Ja zrobiłem sobie mechanizm cache'owania właśnie w taki sposób że zapytanie do bazy zapisywane jest do pliku w postaci zserializowanej tablicy. Po testach wychodzi na to że odczytanie np 5 kbajtów danych z pliku 1000 razy jest kilkanaście/kilkadziesiąt razy szybsze od pobierania tego z bazy. Natomiast bardzo mnie zastanowiło to (niestety nie miałem czasu zrobić porządniejszych testów) że odczytanie tych samych danych z tym że będzie ich nie 5 kbajtów a 500 kbajtów to już jest problem ponieważ wcale to nie jest już szybsze od pobierania danych z bazy (może problem tkwi z moim serwerku bazodanowym + apache). Wydaje mi się że warto cache'ować ale rozsądne wielości danych ponieważ w pewnym momencie granica pomiędzy wydajnością zaciera się. Aha... do zapisywania i pobierania danych używałem (un)serialize/file_(get|put)_content itd.
sajborg
21.03.2007, 00:02:14
Cytat(arecki @ 21.03.2007, 00:36:58 )

(un)serialize/file_(get|put)_content itd.
Dokladnie to samo chcialem zrobic, Ale wtedy co zapisywac do pliku wyniki wyszukiwania w całosci ? Chyba nie, Myslalem ze zeby bylo szybciej to walnac to pliku tylko powiedzmy odnosniki do odpowiednich wpisów w bazie. Powiedzmy zapisywac do pliku tylko idy.
Łukasz O.
21.03.2007, 09:44:46
spójrz na rozwiązanie CodeIgniter'a - u mnie sprawdza się całkiem nieźle
kwiateusz
21.03.2007, 09:49:17
czyli serializacja i zapis dla pliku dla poszczególnych kontrolerów

mi to pasuje a i szybkość skryptu wzrasta względem pobierania ciągle danych z bazy (ale ten sposób został poruszony jako pierwszy

)
Sh4dow
21.03.2007, 10:07:28
A moze tuning servera ? Jesli dane sie dosc czesto zmieniaja to cache nie ma sensu. Zreszta np. MySQL posiada system cache w sobie. No chyba ze macie wylaczony albo ma bardzo malo pamieci przydzielonej. Ja proponuje poprawniej zaprojektowac baze danych i zapytania. Naprawde to czasami potrafi zdziałać cuda.
Co do samego systemu, toproponuje przy jakims waszym "Layer'ze" do bazy danych dodac parametr czy to zapytanie ma byc w cache czy nie. No bo jesli bedzie trzeba dac zapytania z 'NOW()' to dupa blada.
serializacja moze ma czasami problemy, ale z base 64 jest poprostu wygodna. "Odserializowana" tablica/obiekt jest chyba duzo przyjemniejsza w obsludze niz czysty text. Przydal by sie mechanizm monitorujacy Inserty i Update zeby aktualizowac albo raczej usuwac pliki cache ktore juz bedą nieaktualne.
Zastanawialem sie osobiscie o base sqlite jako bazy z cache gdzie dane beda trzymane w specjalnie zrobionej bazie z danymi, ale to sprowadza sie do tego ze lepiej jest zaprojektowac lepiej baze danych i zapytania niż taka zabawa.
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.