![]() |
![]() |
![]()
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=...; ?> ? |
|
|
![]() |
![]()
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: [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... |
|
|
![]() ![]() |
![]() |
Aktualny czas: 6.10.2025 - 23:40 |