Skonfigurowałem tabelę z indeksem tylko na done_status (done_status = INT):
Kiedy używam:
EXPLAIN SELECT * FROM reminder WHERE done_status=2
Odzyskuję to:
id select_type typ tabeli możliwe klucze klucze key_len ref wiersze Extra 1 PROSTE przypomnienie WSZYSTKO done_status NULL NULL NULL 5 Używanie gdzie
Ale kiedy wydam to polecenie:
EXPLAIN SELECT * FROM reminder WHERE done_status=1
Otrzymuję następujące informacje:
id select_type typ tabeli możliwe klucze klucze key_len ref wiersze Extra 1 SIMPLE przypomnienie ref done_status done_status 4 const 2
Do EXPLAIN
pokazuje mi, że używa 5 rzędów, po raz drugi 2 rzędy.
Nie sądzę, że indeks jest używany, jeśli dobrze go zrozumiałem, powinien dać mi 3 wiersze. Co robię źle?
SHOW INDEX FROM reminder
:
Tabela Non_unique nazwa_klucza Seq_in_index nazwa_kolumny Sortowanie Liczność Podpunkt Pakowane Null Typ indeksu Komentarz Indeks przypomnienie 1 done_status 1 done_status A 5 NULL NULL BTREE
wyjaśnij rozszerzone:
id select_type typ tabeli możliwy_klucz klucz key_len ref wiersze filtrowane Extra 1 PROSTE przypomnienie przypomnienie done_status done_status 4 const 2 100.00
show warnings
nie okazał niczego interesującego.
Odpowiedzi:
Nie rozumiesz, czym jest pole „wiersze”. Jest to liczba wierszy, które szacuje mysql, które powinien odczytać, aby spełnić twoje zapytanie. Ta wartość może być dość niedokładna. Nie oznacza to, że jest to liczba wierszy w wyniku - ani faktyczna liczba wierszy odczytanych przez mysql
źródło
Pierwsza wersja wykonania na pewno nie korzysta z indeksu,
może to być schemat informacyjny. Statystyki w indeksie nie nadążają za danymi po niektórych operacjach zapisu lub do tabeli nie można uzyskać dostępu przez długi czas.
jak wyjaśnić tutaj: - Skąd MySQL Query Optimizer odczytuje statystyki indeksu?
w przypadku drugiego planu wykonania wydaje się, że informacja_schema.statistics już nadrobiła zaległości i rozwiązała problem liczności NULL.
Dlatego wykonuje zapytanie zgodnie z optymalizatorem indeksu.
W przypadku tabeli z małymi rzędami nie ma to większego znaczenia.
Ale dane będą rosły, programista powinien zawsze to sprawdzić
i przeprowadzić niezbędną analizę tabeli, gdy liczebność napotkania w indeksie jest zerowa.
źródło
Pierwszy plan wykonania nie korzysta z indeksu.
Ze strony referencyjnej MySQL :
Jeśli twoja tabela ma tylko 5 wierszy, a zapytanie wybiera 3 z nich, wówczas optymalizator MySQL zakłada, że bardziej wydajne jest skanowanie całej tabeli.
źródło