Dlaczego typ_danych_cache jest domyślnie wyłączony, zaczynamy od MySQL 5.6?

28

Uaktualniliśmy do MySQL 5.6 i zaczęliśmy zauważać znaczny wzrost obciążenia serwera db, i wreszcie dowiedzieliśmy się, że query_cache_typedomyślnie domyślnie ustawiony jest na start od 5.6.

Włączyliśmy go ponownie i widzimy zmniejszenie ładowania, dlaczego ta wartość jest domyślnie wyłączona, zaczynamy od MySQL 5.6? Nie widzę problemu z włączoną obsługą.

Joga
źródło

Odpowiedzi:

39

Potrzebujesz historii InnoDB, aby zrozumieć dlaczego. Oto jest:

HISTORIA WOJNY

InnoDB i pamięć podręczna zapytań są w stanie ciągłej wojny. InnoDB jest bardzo obciążony podczas sprawdzania zmian w puli buforów InnoDB, a następnie sprawdzania pamięci podręcznej zapytań pod kątem tych samych zmian.

TRAKTAT POKOJOWY

Przed MySQL 5.0 pamięć podręczna zapytań była wyłączona dla InnoDB. Teraz InnoDB współdziała z nim. Aby uprościć sprawy, możesz po prostu wyłączyć pamięć podręczną zapytań, ustawiając rozmiar_danych_pytania na 0.

Zgodnie z dokumentacją MySQL na zapytanie_czas_buforu

Jeśli serwer jest uruchamiany z typem zapytania_cache_pracy ustawionym na 0, w ogóle nie uzyskuje muteksu pamięci podręcznej zapytań, co oznacza, że ​​buforowania zapytań nie można włączyć w czasie wykonywania, a wykonywanie zapytania jest zmniejszone.

WARUNKI ZRZECZENIA SIĘ

Ustawienie parametru query_cache_size na 0 nie jest rozwiązaniem uniwersalnym.

Przyczyną wojny są przede wszystkim koszty ogólne. InnoDB zawsze sprawdza zmiany. Większa pamięć podręczna zapytań sprawi, że InnoDB będzie działać znacznie ciężej. Wyłączając pamięć podręczną zapytań, niech InnoDB i pamięć podręczna zapytań będą szczęśliwe. Jednak Ty (Deweloper / DBA) możesz być ofiarą tej wojny z powodu złej wydajności zapytań, nawet przy takim traktacie pokojowym.

W zależności od poniższych

  • Obciążenie pracą
  • Częstotliwość zmian
  • Częstotliwość odczytu tych samych danych

powinieneś ustawić query_cache_size na dowolną liczbę, która Twoim zdaniem zwiększa wydajność (Jest to równoznaczne z rozpoczęciem podziemnego ruchu).

EPILOG

Jeśli zastanawiasz się, gdzie wymyśliłem tę historię wojenną, zobacz mój stary post

Przeczytaj go uważnie, ponieważ nauczyłem się tego na stronach 209-215 High Performance MySQL (wydanie drugie)

Zalecałem wcześniej wyłączenie pamięci podręcznej zapytań innym osobom

UWAGA: Zdaję sobie sprawę, że pytanie dotyczyło typu query_cache_type . Ma to wpływ na pamięć podręczną zapytań. Wyłączenie pamięci podręcznej powoduje, że dominuje nad nią InnoDB. Ręczne ustawienie typu query_cache_cpe zmusza programistę / DBA do dokładnego przemyślenia rodzaju zapytań, jakie napotka bufor podręczny.

RolandoMySQLDBA
źródło
Cześć, przeczytałem wszystkie twoje linki. W rzeczywistości próbowałem ponownie wyłączyć pamięć podręczną zapytań i widzimy, że ładowanie ponownie znacznie wzrosło .. więc musimy włączyć ponownie. Nie mówię, że to, co mówisz, jest złe, może po prostu nasza aplikacja jest odczytywana intensywnie, a pamięć podręczna zapytań jest bardzo przydatna, aby zmniejszyć ładowanie .. (w naszej witrynie działa WordPress)
Yoga
3
Gdyby tylko więcej postów SO czytać w ten sposób (dzięki za zabawną analogię)! Założę się, że szczęśliwe dzieci Rolando co noc opowiadają takie historie na dobranoc MySQL! ;)
rinogo,
2
„Strony 209–215 wysokiej wydajności MySQL (wydanie drugie)” odnoszą się do rozdziału o nazwie „Pamięć podręczna zapytań MySQL”, od „Kiedy pamięć podręczna zapytań jest pomocna” i do końca. Odpowiada to stronom 320-329 w 3. edycji.
Peter V. Mørch,
8

Mam wpis na blogu wyjaśniający, dlaczego to tutaj jest .

Wersja skrócona: pamięć podręczna zapytań powoduje problemy ze skalowalnością na komputerach wielordzeniowych. Więc teraz jest domyślnie wyłączony.

Morgan Tocker
źródło
Jako kontynuacja mojego postu Stewart Smith opisuje wpływ jako „rząd wielkości” gorszy flamingspork.com/blog/2014/06/05/…
Morgan Tocker
4

Aby uzupełnić odpowiedzi, nacisk Oracle na „zastąpienie” funkcji pamięci podręcznej zapytań to integracja memcached .

jynus
źródło