MySQL - wymusza nieużywanie pamięci podręcznej do testowania szybkości zapytania

343

Testuję szybkość niektórych zapytań w MySQL. Baza danych buforuje te zapytania, co utrudnia uzyskanie wiarygodnych wyników podczas testowania szybkości tych zapytań.

Czy istnieje sposób na wyłączenie buforowania dla zapytania?

System: MySQL 4 na webhostingu Linux, mam dostęp do PHPMyAdmin.

Dzięki


źródło

Odpowiedzi:

527

Spróbuj użyć opcji SQL_NO_CACHE (MySQL 5.7) w zapytaniu. (Użytkownicy MySQL 5.6 klikają TUTAJ )

na przykład.

SELECT SQL_NO_CACHE * FROM TABLE

Spowoduje to zatrzymanie buforowania wyników przez MySQL, jednak należy pamiętać, że inne pamięci podręczne systemu operacyjnego i dysków mogą również wpływać na wydajność. Trudniej jest je obejść.

Jarod Elliott
źródło
5
Dokumentacja
Salman von Abbas
4
Fajny artykuł o pamięci podręcznej zapytań mysql. Jak skonfigurować i zobaczyć pamięć podręczną w akcji! Warto przeczytać. databasejournal.com/features/mysql/article.php/3110171/...
Adrian P.
1
Przed próbą zwiększenia wydajności spróbuj zrestartować serwer mysql. Być może jakiś proces wpływa na wszystko. To się stało ze mną. Chociaż jest to komentarz, który nie ma bezpośredniego związku z problemem, może pomóc wielu osobom.
dellasavia
2
To powstrzymuje go przed buforowaniem wyników, ale czy powstrzymuje go również przed użyciem pamięci podręcznej?
Brett,
3
@Brett zobacz komentarz SalmanPK z powrotem w '11. Ta strona z dokumentami zawiera dosłownie 4 zdania i bezpośrednio odpowiada na twoje pytanie. W przypadku usunięcia strony w przyszłości: „Nie sprawdza pamięci podręcznej zapytań, aby sprawdzić, czy wynik jest już buforowany, ani nie buforuje wyniku zapytania”.
Maurice
121

Inna alternatywa, która wpływa tylko na bieżące połączenie:

SET SESSION query_cache_type=0;
John Carter
źródło
Mój błąd. Nie query_cache_sizepatrzyłem na to query_cache_type. Mieszałem odpowiedź twoją i SeniorDev.
Mike
30

Istnieje również opcja konfiguracji: rozmiar_pamięci_podstawowej = 0

Aby wyłączyć pamięć podręczną zapytań podczas uruchamiania serwera, ustaw zmienną systemową query_cache_size na 0. Wyłączenie kodu pamięci podręcznej zapytań nie powoduje zauważalnego obciążenia. Jeśli budujesz MySQL ze źródła, możliwości buforowania zapytań można całkowicie wyłączyć z serwera, wywołując config z opcją --without-query-cache.

Zobacz http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

barbushin
źródło
24

Możesz także uruchomić polecenie follow, aby zresetować pamięć podręczną zapytań.

RESET QUERY CACHE
djt
źródło
9
To prawdopodobnie przesada ... najlepiej, aby MySQL tymczasowo zignorował pamięć podręczną.
BMiner
3
Potrzebne są również do tego specjalne uprawnienia.
Erick Robertson
19

Jeden problem z

SELECT SQL_NO_CACHE * FROM TABLE

Metoda polega na tym, że wydaje się, że zapobiega tylko buforowaniu wyniku zapytania. Jeśli jednak odpytujesz bazę danych, która jest aktywnie używana z zapytaniem, które chcesz przetestować, inni klienci mogą buforować twoje zapytanie, wpływając na wyniki. Nadal szukam sposobów na obejście tego, edytuję ten post, jeśli go wymyślę.

wbharding
źródło
1
Ale jeśli pamięć podręczna zostanie zapełniona przez innych, złudzisz szybkość. Ale czasami nie.
karatedog
14

Użyłbym następujących:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';
Sergio Costa
źródło
3

Użycie zmiennej zdefiniowanej przez użytkownika w zapytaniu powoduje, że kwerenda jest ponownie nieczytelna. Uważam, że jest to znacznie lepszy wskaźnik niż używanie SQL_NO_CACHE. Ale powinieneś umieścić zmienną w miejscu, w którym ustawienie zmiennej nie miałoby poważnego wpływu na wydajność:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;
Newtover
źródło
3
„Uważam, że jest to znacznie lepszy wskaźnik niż używanie SQL_NO_CACHE”. Jak to? Wydaje się, że potrzebujesz dość mocnego argumentu za użyciem niejasnego hackowania nad jawnym słowem kluczowym, chyba że jawne słowo kluczowe nie robi tego, co twierdzi.
Air
1
@Air Znalazłem również to rozwiązanie, które działa lepiej niż SQL_NO_CACHE. SQL_NO_CACHE działało po raz pierwszy, uruchamiając zapytanie, ale potem nie działało ponownie. Zakładam, że jest to spowodowane innymi mechanizmami buforowania. Myślę, że działa to lepiej, ponieważ wyszukiwanie oparte na zmiennej nie może być buforowane przez żadną warstwę lub mechanizm - przynajmniej tak sądzę.
Klik
2

Jeśli chcesz wyłączyć pamięć podręczną zapytań, ustaw opcję „rozmiar_pamięci_pytania” na 0 w pliku konfiguracyjnym mysql. Jeśli ustawiona wartość 0 mysql nie będzie używać bufora zapytań.

Jinesh
źródło