Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> DB Cache, Wskazówki
cadavre
post
Post #1





Grupa: Zarejestrowani
Postów: 472
Pomógł: 7
Dołączył: 7.12.2005
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Mam kilka pytań dot. cacheowania zapytań DB:

1. Jak rozpoznawać o które SQL chodzi? Ja każde zapytanie strtolow'uję, opróżniam ze znaków ['|"|`] i spacji a potem hash'uję w md5 - hash'em rozpoznaję query i nazywam pliki. Jak zrobić to inaczej, szybciej? Jak wiadomo replace i md5, które korzysta z algorytmów matematycznych, zajmują sporo czasu.
2. Czy sprawdzanie if( $czas_utworzenia_pliku > $aktualny_czas - $interwał ) { z_cache'u } jest dobrym sposobem na sprawdzenie terminu ważności pliku z cache'm?
3. W jaki sposób połączyć klasy db i cache'u? U mnie jeśli zapytanie ma być cache'owane wysyła do własnego fetch'a string, jeśli nie cacheowane - wysyła resource z query. Fetch sprawdza is_string i is_resource. To rozwiązanie jednak do najszybszych nie należy.
4. Pliki z cache'm zapisywać jako zserialiowaną tablicę czy po prostu jako <?php $arr=...; ?> ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
cadavre
post
Post #2





Grupa: Zarejestrowani
Postów: 472
Pomógł: 7
Dołączył: 7.12.2005
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


HAHA! (IMG:http://forum.php.pl/style_emoticons/default/laugh.gif) Panowie właśnie odzyskałem wiarę w siebie. (IMG:http://forum.php.pl/style_emoticons/default/Rkingsmiley.png) Już tłumaczę.
Napisałem sobie śliczniutki skrypcik do cache'owania zapytań z bazy danych. Kod wyglądał bardzo dobrze i wszystko działo - z tym, że jakoś wolno. Postanowiłem zadać pytania zawarte w pierwszym poście (wciąż aktualne) i postanowiłem pousuwać pewne elementy w moim skrypcie lub pozamieniać na stałe (jak np. generowanie md5 sql'a). Tym sposobem robiłem co usunięcie - benchmark czasu zapytania:
  1. SELECT script_time,queries,SUM(queries),AVG(script_time)
  2. FROM statystyka_system WHERE DATA
  3. BETWEEN '2006-12-10 00:00' AND '2006-12-20 00:00'
  4. GROUP BY script_time
[tabela 11,6KB z 324. wpisami]

Oto wyniki:
Kod
mysql_        2,89
mój fetch     3,09
query tp      9,20
query gp      8,67
query tp+bh   8,23
query gp+bh   7,83
query bst     7,50
query nBUG    0,08

tp - tworzenie pliku cache
gp - gotowy plik cache (istniejący)
bh - bez hashowania
bst - bez sprawdzania typu (is_string i is_resource)
nBUG - po znalezieniu błędu w kodzie

Po kolei:
query na systmowych mysql_ (bez cache)
query z moim fetch (bez cache)
query z tworzeniem pliku cache (z cache)
query z utworzonego pliku (z cache)
query z tworzeniem pliku bez hasha (z cache)
query z utworzonego pliku bez hasha (z cache)
query z utworzonego pliku bez hasha, bez sprawdzania typów (z cache)
query po znalezieniu głupiego błędu (z cache)

W/w błąd to odczytywanie za każdym razem pliku z cachem z HDD: każdy row - na nowo odczytany plik. Powodem było "wylezienie" metody read() poza pierwszego if'a. Różnica pomiędzy odczytywaniem z bazy danych to ponad 2,81sekundy!
Dodatkowo co zwalnia system:
Kod
Tworzenie pliku query    +0,50sec
Hashowania zapytania     +0,90sec
Sprawdzanie typów i if   +0,30sec

Teraz tylko muszę powyższe czynniki zmodyfikować by je przyspieszyć (jak na razie dodając je i czas query z cache jest jakieś ~1,78sec więc i tak szybciej niż query z bazy danych).

Gdy tylko wprowadzę poprawki - przedstawię kod i wrzucę do gotowych "Algorytmy, skrypty...".

Na przyszłość:

Czas utworzenia pliku filectime nie oznacza czasu utworzenia pliku, a czas węzła pliku. Zatem jeśli tworzymy plik o takiej samej nazwie na miejsce nowego - data jego utworzenia zostanie zachowania. W systemie cacheowania należy posłużyć się funkcją filemtime. Straciłem przez to g***o z 1h 30min...
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 23:40