„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:
- najszybciej - pobieranie danych indeksowych z pamięci podręcznej indeksu MySQL. Koszt to kilka operacji związanych z pamięcią.
- 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ą.
- 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ą.
- 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.
Czy używasz tabel MyISAM lub Innodb? – Martin
@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
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