2010-10-02 15 views
51

MySQL Workbench zgłasza wartość o nazwie "Key Efficiency" w związku ze zdrowiem serwera. Co to oznacza i jakie są jego konsekwencje?Co to jest "Kluczowa wydajność" MySQL

alt text

Od MySQL.com "Key Efficiency" to:

... wskazanie liczby key_read_requests które spowodowały rzeczywiste key_reads.

Ok, więc co to znaczy. Co mi mówi o tym, jak mam nastroić serwer?

+0

Czy używasz tabel MyISAM lub Innodb? – Martin

+0

@Martin Pytam o implikację samych wartości, nie próbując dostroić konkretnej instancji MySQL. Obraz jest tylko przykładem, który pokazuje, gdzie znaleźć informacje. – tylerl

+3

Jeśli chodzi o dostrajanie serwera, mechanizm magazynowania, którego używasz (MyISAM vs InnoDB vs ...) wpłynie na zmienne, które potrzebujesz dostroić. Dla MyISAM kluczowy rozmiar bufora jest krytyczny. W przypadku InnoDB jest to innodb_buffer_pool_size. Mają one wpływ na to, ile kluczy może zostać zbuforowanych w przestrzeni adresowej MySQL. Ogólnie rzecz biorąc, im więcej, tym lepiej. Jednakże, jak zauważa Michael Eakins, jeśli twój system ma dużo pamięci, system plików będzie w każdym przypadku buforował znaczną część indeksu. – Martin

Odpowiedz

73

„Key Efektywność” jest wskazanie, ile wartość otrzymujesz od skrytek indeksów przechowywanych w obrębie pamięci MySQL.Jeśli twoja kluczowa wydajność jest wysoka, to najczęściej MySQL wykonuje kluczowe wyszukiwania z przestrzeni pamięci, która jest znacznie szybsza niż konieczność pobrania odpowiednich bloków indeksu z dysku.

Sposobem na poprawę efektywności kluczowych jest przeznaczenie większej ilości pamięci systemowej na pamięci podręczne indeksów MySQL. Sposób, w jaki to robisz, zależy od używanego mechanizmu magazynowania. W przypadku MyISAM, zwiększ wartość klucza-rozmiaru bufora. W przypadku InnoDB zwiększ wartość puli innodb-buffer-pool.

Jednak, jak zauważa Michael Eakins, system operacyjny przechowuje również pamięci podręczne bloków dyskowych, do których ostatnio się dostał. Im więcej pamięci ma twój system operacyjny, tym więcej bloków dysku może buforować. Co więcej, same napędy dyskowe (i kontrolery dysków w niektórych przypadkach) mają również pamięć podręczną - co również może przyspieszyć pobieranie danych z dysku. Hierarchia wygląda trochę tak:

  1. najszybciej - pobieranie danych indeksowych z pamięci podręcznej indeksu MySQL. Koszt to kilka operacji związanych z pamięcią.
  2. pobieranie danych indeksowych przechowywanych w pamięci podręcznej systemu plików OS. Koszt to wywołanie systemowe (do odczytu) i niektóre operacje związane z pamięcią.
  3. pobieranie danych indeksowych przechowywanych w pamięci podręcznej systemu dysków (kontroler i napędy). Koszt to wywołanie systemowe (do odczytu), komunikacja z urządzeniem dyskowym i niektóre operacje związane z pamięcią.
  4. slowest - pobieranie danych indeksowych z powierzchni dysku. Koszt to wywołanie systemowe, komunikacja z urządzeniem, ruch fizyczny dysku (ruch ramion + obrót).

W praktyce różnica między 1 a 2 jest prawie niezauważalna, chyba że system jest bardzo zajęty. Ponadto jest mało prawdopodobne (chyba że twój system ma mniej zapasowej pamięci RAM niż kontroler dysku), że scenariusz 3 wchodzi w grę.

Użyłem serwerów z tabelami MyISAM ze stosunkowo małymi buforami indeksów (512 MB), ale ogromną pamięcią systemową (64 GB) i okazało się, że trudno jest wykazać wartość zwiększania rozmiaru pamięci podręcznej indeksu. Chyba zależy to od tego, co jeszcze dzieje się na twoim serwerze. Jeśli wszystko, czego używasz, jest bazą danych MySQL, jest całkiem prawdopodobne, że pamięć podręczna systemu operacyjnego będzie dość skuteczna. Jeśli jednak uruchamiasz inne zadania na tym samym serwerze, a używają one wielu dostępów do pamięci/dysku, mogą one usuwać cenne buforowane bloki indeksów, co prowadzi częściej do trafienia dysku MySQL.

Interesującym ćwiczeniem (jeśli masz czas) jest majstrowanie przy systemie, aby działał wolniej. Uruchamianie standardowego obciążenia wielkimi tabelami, redukuje bufory MySQL, dopóki efekt nie stanie się zauważalny. Przepłucz pamięć podręczną systemu plików, pompując ogromne ilości (większe niż pamięć RAM) nieistotnych danych za pośrednictwem systemu plików (cat large-file>/dev/null). Obserwuj iostat podczas uruchamiania zapytań.

"Key Efficiency" NIE jest miarą tego, jak dobre są twoje klucze. Dobrze zaprojektowane klucze będą miały znacznie większy wpływ na wydajność niż wysoka "Key Efficiency". MySQL niestety nie ma wiele do zaoferowania.

+1

Dzięki za badania! – tylerl

7

Key_read_requests to liczba żądań odczytania bloku klucza z pamięci podręcznej. Podczas gdy key_reads jest liczbą fizycznych odczytów bloku klawiszy z dysku. Tak więc te 2 zmienne mogą zwiększać się niezależnie. (http://bugs.mysql.com/bug.php?id=28384)

Co jest nadal tak jasne, jak błoto.

do następnego kawałka wyjaśnieniu:

A częściowo poprawnego użycia wzoru Key_reads

Jest częściowo ważny powód do zbadać wzoru Key_reads, zakładając, że mamy dbają o liczbie fizycznego to się dzieje, ponieważ wiemy, że dyski są bardzo powolne w stosunku do innych części komputera. I tutaj jest gdzie wracam do tego, co nazwałem "głównie faktem" powyżej, ponieważ Key_reads faktycznie nie są fizyczne odczytuje w ogóle dysk. Jeśli żądany blok danych nie znajduje się w działającej pamięci podręcznej systemu, to odczyt Key_read to odczyt - ale jeśli jest buforowany, to to po prostu wywołanie systemowe. Jednak zróbmy nasz pierwszy trudny do udowodnienia Założenie:

trudno udowodnić założenie # 1: Key_read może odpowiadać odczytu dysku fizycznym, może. Jeśli przyjmiemy to założenie jako prawdziwe, to jaki inny może być powód, dla którego będziemy dbać o o Key_reads? To założenie prowadzi do "pamięci podręcznej chybień jest znacznie wolniejsze niż trafienie w pamięci podręcznej", co sprawia, że ​​ ma sens. Gdyby tak samo szybko było zrobić klucz_read_request, to jaki byłby bufor klucza? Zaufajmy twórcom MyISAM na tej jednej, ponieważ zaprojektowali hit pamięci podręcznej , aby być szybszym od miss. (http://planet.mysql.com/entry/?id=23679)