Strojenie (i zrozumienie) table_cache w mySQL

18

Uruchomiłem doskonały skrypt dostrajania wydajności MySQL i zacząłem pracować z sugestiami. Jednym z nich byłam

TABELA
DACHU Bieżąca wartość table_cache = 4096 tabel Masz w sumie 1073 tabele. Masz 3900 otwartych stołów. Bieżący współczynnik trafień table_cache wynosi 2%, podczas gdy 95% twojego bufora tabeli jest w użyciu. Prawdopodobnie powinieneś zwiększyć swój table_cache

Zacząłem czytać na table_cache, ale stwierdziłem, że brakuje dokumentacji MySQL . Mówią, aby zwiększyć table_cache„jeśli masz pamięć”. Niestety table_cachezmienna jest zdefiniowana jako „Liczba otwartych tabel dla wszystkich wątków”.

Jak zmieni się pamięć używana przez MySQL, jeśli zwiększę tę zmienną? Jaka jest dobra wartość, aby ją ustawić?

jotango
źródło

Odpowiedzi:

16

Z dokumentacji MySQL

Na przykład, dla 200 jednoczesnych uruchomionych połączeń, powinieneś mieć rozmiar pamięci podręcznej tabeli co najmniej 200 × N, gdzie N jest maksymalną liczbą tabel na łączenie w dowolnym wykonywanym zapytaniu. Musisz także zarezerwować dodatkowe deskryptory plików dla tabel tymczasowych i plików.

Jeśli więc w aplikacji masz zapytanie, które łączy 4 tabele i chcesz obsługiwać 200 równoczesnych połączeń, na podstawie tej instrukcji powinieneś mieć co najmniej 800 table_cache.

Jeśli chodzi o wykorzystanie pamięci, nie mam tych liczb, podejrzewam, że będzie to zależeć od wielkości twoich tabel, które buforuje.

ManiacZX
źródło
Dzięki za wskaźnik. Trochę boję się zwiększyć mój numer table_cache, nie wiedząc, jak zmieni się użycie pamięci RAM. Pamięć RAM urządzenia jest już pełna.
jotango
Czy na pewno pamięć została faktycznie wykorzystana, czy tylko pamięć została zajęta przez bufory / pamięć podręczną? Uruchom „free -m” i spójrz na drugą linię (- / + bufory / cache), jest to dokładniejsza reprezentacja wykorzystania pamięci w MB. Zobacz odpowiedzi w serverfault.com/questions/73189/… i serverfault.com/questions/9442/…
ManiacZX
Tak, naprawdę wykorzystuje pamięć. Wczoraj zamienił się, co jest naprawdę złe dla db produkcji. Zamówiłem dzisiaj aktualizację pamięci RAM od HP.
jotango,
dla tych, którzy przyjdą do tego teraz, ta odpowiedź nie jest poprawna dla mysql 5.1+. teraz odnosi się do, table_open_cachekiedy patrzysz na dokumenty. Patrz odpowiedź @ MarkRs, patrząc natable_cache
Jason
3

Powinieneś monitorować zmienną Opened_Tables i zobaczyć, jak szybko rośnie. Jeśli jest to znacznie szybsze niż tworzenie nowych tabel (w tym tymczasowych), pamięć podręczna tabel może być za mała.

Tabela_pamięci podręcznej powinna zawsze - a właściwie przede wszystkim - być znacznie większa niż całkowita liczba tabel na serwerze. W przeciwnym razie będzie otwierać i zamykać stoły.

Nie widzę, jak można uzyskać współczynnik trafień w pamięci podręcznej wynoszący 2%, chyba że mierzysz czas tuż po ponownym uruchomieniu serwera lub często używasz TABLIC PŁUCZĄCYCH (w stosunku do liczby zapytań). Zwykle wskaźnik trafień w pamięci podręcznej tabeli powinien wynosić 99,9%, w przeciwnym razie wydajność będzie do dupy.

Nie rób FLUSH TABLES, jeśli możesz tego uniknąć, to zdmuchuje pamięć podręczną.

Otwieranie tabel jest drogie, ponieważ wymaga odczytu pliku FRM. W MyISAM jest znacznie gorzej (niż w innych silnikach), ponieważ kiedy zamyka tabelę, wyrzuca także wszystkie bloki pamięci podręcznej kluczy, które pochodziły z jej indeksów. Więc zamknięcie tabeli zrzuca jej indeksy z pamięci podręcznej kluczy == źle! Inne silniki zachowują zbuforowane bloki, ale nadal muszą ponownie odczytać metadane i przydzielić niektóre struktury.

MarkR
źródło