W poprzednim poście opisywałem znaczenie poszczególnych wartości zbieranych przez MySQL w parametrach Handler_read_*. Dziś parę słów dlaczego te dane są tak przydatne?

To co dziś napiszę, raczej nie powinno być żadnym zaskoczeniem, szczególnie po poprzednim poście. Dane te przekazują nam informację o różnych rodzajach działalności, jakie serwer MySQL wykonuje. Dowiadujemy się, czy wykonywane są sortowania, dowiadujemy się czy wykonywane są pełne skany indeksów bądź tabel. W oparciu o te informacje możemy sobie wygenerować pewien obraz działalności serwera – jak duża część zapytań nie korzysta z indeksów? Jak duża ilość zapytań wykonuje sortowanie przy pomocy algorytmu filesort?

W przypadku MySQL niepoindeksowane zapytania i zapytania, które wymagają wykonania filesort to często większa część nieoptymalnych zapytań. Z takich najbardziej popularnych przypadków pozostają jeszcze zapytania, które generują tabele tymczasowe, w szczególności tabele tymczasowe na dysku. Jeśli jesteśmy w stanie ocenić, jaki procent zapytań stanowią te dwa typy, w sporej części przypadków możemy stwierdzić, jaki rodzaj problemów dotyka dany serwer MySQL. Możemy to stwierdzić bez zbierania slowlogów i ich dalszej analizy – wystarczy uruchomienie zapytania SHOW GLOBAL STATUS;.

Z tych powodów zmienne te są często wykorzystywane do analizy stanu serwera. Jeśli ktoś z czytelników miał styczność z pt-mysql-summary, narzędziem z zestawu Percona Toolkit, które generuje zbiorczą informację o serwerze MySQL, prawdopodobnie kojarzy, że narzędzie to prezentuje także te dane:

Handler_read_first                            4
Handler_read_key                          60000
Handler_read_next                          1500
Handler_read_prev                          1000
Handler_read_rnd                            800
Handler_read_rnd_next                    450000           5          35

Kolejne kolumny to (w zaokrągleniu) łączna wartość od resetu statystyk, przyrost w ciągu sekundy i przyrost w przeciągu 10 sekund. Na powyższym przykładzie widać, że WordPress (bo taka strona korzysta z tego serwera MySQL) powinien popracować nad strukturą bazy danych. Należałoby dokładnie przeanalizować zapytania i prawdopodobnie dałoby się dodać kilka przydatnych indeksów – na to może wskazywać wysoka wartość Handler_read_rnd_next, czyli fakt, że sporo zapytań wykonuje pełny skan tabeli.

Jeśli korzystamy z Cacti i template przygotowanego przez Perconę, w domyślnej konfiguracji rysowany jest wykres zbiorczy dla wszystkich powyższych parametrów. Dzięki temu możemy sprawdzić, jak wyglądała zmiana rodzaju ruchu w czasie. Jeśli na wykresach widać jakieś anomalie, chwilowe skoki któregoś z niekorzystnych parametrów, można na tej podstawie zlokalizować przedział czasowy, w którymś coś się działo, i z którego należałoby przeglądnąć zapytania w slowlogu.

Jeżeli nie mamy pod ręką dostępnych żadnych narzędzi, nadal możemy sprawdzić co w chwili obecnej dzieje się na serwerze – możemy wykorzystać polecenie mysqladmin:

mysqladmin -ri 1 ext | grep Handler_read
| Handler_read_first                    | 490        |
| Handler_read_key                      | 5798719    |
| Handler_read_next                     | 157796     |
| Handler_read_prev                     | 105103     |
| Handler_read_rnd                      | 77011      |
| Handler_read_rnd_next                 | 47936087   |
| Handler_read_first                    | 0          |
| Handler_read_key                      | 0          |
| Handler_read_next                     | 0          |
| Handler_read_prev                     | 0          |
| Handler_read_rnd                      | 0          |
| Handler_read_rnd_next                 | 307        |
| Handler_read_first                    | 0          |
| Handler_read_key                      | 3          |
| Handler_read_next                     | 0          |
| Handler_read_prev                     | 0          |
| Handler_read_rnd                      | 0          |
| Handler_read_rnd_next                 | 328        |
| Handler_read_first                    | 0          |
| Handler_read_key                      | 0          |
| Handler_read_next                     | 0          |
| Handler_read_prev                     | 0          |
| Handler_read_rnd                      | 0          |
| Handler_read_rnd_next                 | 307        |
| Handler_read_first                    | 0          |
| Handler_read_key                      | 0          |
| Handler_read_next                     | 0          |
| Handler_read_prev                     | 0          |
| Handler_read_rnd                      | 0          |
| Handler_read_rnd_next                 | 307        |

W powyższy sposób co sekundę otrzymujemy informacje o przyroście każdego parametru z grupy Handler_read_*

Tego typu informacje są bardzo przydatne dla administratora. W szczególności wykresy Cacti, gdzie mamy możliwość przeanalizowania zmian w strukturze ruchu na serwerze MySQL.