Łączę bazę danych MySQL z PHP Data Objects (PDO) i wykonuję rozległe zapytanie SQL. Zwykle zajmuje to około 1500 ms; Nadal muszę to zoptymalizować. Kiedy uruchamiam skrypt PHP dwa razy z krótką przerwą pomiędzy nimi, zapytanie zajmuje tylko około 90 ms. Kwerenda jest w obu przypadkach taka sama. Po uruchomieniu skryptu z tym samym zapytaniem po pewnym czasie ponownie zajmuje 1500 ms.
Dlaczego? Czy baza danych buforuje się automatycznie? Czy baza danych zapisuje pamięć podręczną i automatycznie ją usuwa?
Zakładam, że PHP nie może buforować wyników, ponieważ dzieje się tak w dwóch różnych wątkach. Nie sądzę, że PHP zbuforuje wyniki, ponieważ nie może wiedzieć, czy baza danych uległa zmianie.
Mam skrypt uruchamiający się co minutę, aby wstawić nowe wiersze do bazy danych. Może to być również przyczyną, że po pewnym czasie zajmuje to 1500 ms; pamięć podręczna zostałaby usunięta, ponieważ odpowiednie tabele nie są już takie same.
Odpowiedzi:
Jest to prawdopodobnie artefakt pamięci podręcznej zapytań MySQL .
Wykonujesz zapytanie SQL, MySQL buforuje jego wynik, a następne wykonanie jest szybkie. Po uruchomieniu skryptu w celu wstawienia danych do tabel, do których odwołuje się zapytanie, pamięć podręczna wyników zostaje unieważniona i zapytanie musi zostać wykonane „na prawdę” następnym razem.
Z dokumentacji MySQL połączonej powyżej:
źródło
Tak, mySQL (podobnie jak wszystkie inne popularne produkty baz danych) buforuje zapytania, które są do niego kierowane.
Buforowanie jest dość sprytne - często może użyć pamięci podręcznej dla zapytania, nawet jeśli dokładne parametry zapytania nie są takie same. Może to mieć duży wpływ na wydajność.
Buforowanie jest kontrolowane całkowicie w oprogramowaniu serwera DB; nie masz wglądu w zawartość bufora ani jak długo dany element pozostaje w buforze; może być nadpisany w dowolnym momencie, w zależności od tego, jakie inne zapytania są wywoływane itp. Ma on na celu zwiększenie wydajności, ale nie należy polegać na wydajności.
Możesz przeczytać więcej na ten temat tutaj w podręczniku MySQL .
Ponadto użycie PDO pozwala pisać zapytania jako „Przygotowane instrukcje”, wiążąc parametry, a nie kodując je na stałe w postaci ciągów tekstowych. Ma to również wpływ na buforowanie na serwerze DB, a w przypadku powtarzających się zapytań poprawi również wydajność.
źródło
SELECT *
iselect *
oznacza, że poza tym identyczne zapytanie nie będzie obsługiwane z pamięci podręcznej. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . Wysłano link 5.1 w celu zachowania spójności, ale dotyczy wszystkich wersji.