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ć?

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.