W stanie MYSQL wartość Handler_read_rnd_next jest bardzo wysoka.
Wiem, że ta wartość zostanie zwiększona, gdy zostanie wykonane zapytanie, które nie ma odpowiednich indeksów.
Ale nawet gdy wykonujemy status show, taki jak „Handler_read_rnd_next”, wartość ta zwiększa się o 2.
W oparciu o tę flagę stanu monitorujemy niektóre statystyki.
Dlatego za każdym razem statystyki są krytyczne.
Czy możemy wykluczyć te liczby wykonania „pokaż” z liczby „Handler_read_rnd_next”.
Jeszcze jeden przykład tego
Istnieje tabela z 10 wierszami, tabela jest indeksowana w kolumnie „dane”, a jeśli wykonamy następujące zapytanie:
select data from test where data = 'vwx' -> returns one row
a jeśli sprawdzimy wartość „Handler_read_rnd_next”, zostanie ona zwiększona o 7.
Poniżej przedstawiono wynik polecenia wyjaśniania dla powyższego zapytania:
explain select data from test where data = 'vwx';
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, 'SIMPLE', 'test', 'ref', 'data', 'data', '35', 'const', 1, 'Using where; Using index'
Czy jest jakiś sposób na ograniczenie tej wartości lub czy mogę wiedzieć, dlaczego ta wartość jest bardzo szybko zwiększana.
źródło
Odpowiedzi:
Przede wszystkim spójrzmy na definicję Handler_read_rnd_next.
Według dokumentacji MySQL na Handler_read_rnd_next:
Teraz spójrz na swoje zapytanie:
Powiedziałeś, że tabela ma 10 wierszy. Zasadniczo Optymalizator zapytań MySQL odrzuci użycie indeksu, jeśli liczba wierszy, które należy zbadać, jest większa niż 5% całkowitej liczby wierszy.
Zróbmy matematykę. 5% z 10 rzędów to 0,5 wiersza. Nawet jeśli liczba wierszy potrzebnych do zlokalizowania danych wynosi 1, to jest większa niż 0,5. Na podstawie tej niższej liczby wierszy i wspomnianej właśnie reguły indeksu MySQL Query Optimizer zawsze wykona skanowanie tabeli.
Ponieważ sama kolumna
data
jest indeksowana, zamiast skanowania tabeli wykonano skanowanie mysql.Jeśli masz pewność, że tabela testowa nigdy nie wzrośnie, możesz usunąć wszystkie indeksy i umożliwić skanowanie tabeli. Zmienne statusu modułu obsługi powinny przestać zwiększać.
źródło
Jaka wersja MySQL?
Powody, dla których ta flaga jest zwiększana, najlepiej udokumentować tutaj: http://www.mysqlperformanceblog.com/2010/06/15/what-does-handler_read_rnd-mean/
Krótko mówiąc, jest to tylko licznik liczby wierszy pobranych w kolejności podczas pełnego lub częściowego skanowania tabeli.
To powiedziawszy, otrzymuję inny wynik:
źródło
Jeśli w kolumnie „Dane” znajduje się indeks unikatowy / podstawowy, oznacza to, że już wykonałeś optymalizację dla tego zapytania. Nie sądzę, że można na tym dokonać dalszej optymalizacji.
Możesz także sprawdzić, czy wykonano PEŁNE SKANOWANIE TABELI, czy nie?
Upewnij się, że select_scan nie zwiększył swojej wartości, w ten sposób możesz sprawdzić, czy PEŁNE SKANOWANIE TABELI zostało wykonane, czy nie. Powinieneś spróbować zoptymalizować zapytanie, które nie wykona PEŁNEGO SKANOWANIA TABELI.
źródło