Jakie jest znaczenie filtrowania w MySQL wyjaśnić?

21

Jak opisano tutaj w dokumentach MySQL :

Filtrowana kolumna wskazuje szacunkowy procent wierszy tabeli, które będą filtrowane według warunków tabeli. Oznacza to, że wiersze pokazują szacowaną liczbę zbadanych wierszy, a rzędy × filtrowane / 100 pokazuje liczbę wierszy, które zostaną połączone z poprzednimi tabelami. Przed MySQL 5.7.3 ta kolumna jest wyświetlana, jeśli używasz EXPLAIN EXTENDED. Począwszy od MySQL 5.7.3, rozszerzone wyjście jest domyślnie włączone, a słowo kluczowe EXTENDED nie jest konieczne.

Nadal nie rozumiem. Jakie jest znaczenie słowa „filtrowane” tutaj? Jakie informacje możemy uzyskać z tej kolumny?

Na przykład, kiedy zacznę odpytywać, niektóre zapytania pokażą 100, a inne pokażą 18 lub mniej niż 100.

+-------------+-------+--------+---------+---------+------+----------+
| select_type | table | type   | key     | key_len | rows | filtered |
+-------------+-------+--------+---------+---------+------+----------+
| PRIMARY     | a     | range  | search  | 4       |  174 |   18.00  | <--
| PRIMARY     | b     | eq_ref | PRIMARY | 4       |    1 |   100.00 |
| PRIMARY     | c     | ALL    | PRIMARY | 4       |    1 |   100.00 |

Jaki główny punkt możemy wyciągnąć z tej wartości?

Czy to mówi, że kolumna przefiltrowała tylko 18%? A jeśli im niższy wynik, tym lepszy indeks / zapytanie?

Używam MySQL 5.7

Iman Tumorang
źródło

Odpowiedzi:

30

Filtrowanie tutaj oznacza zastosowanie warunku do zestawu wierszy wybranych przez type-search jako potencjalne wiersze i zachowanie tylko wierszy spełniających warunek:

MySQL najpierw spróbuje użyć indeksu, np . Zeskanuje rangetabelę aza pomocą searchklawisza -key. Szacuje się, że 174 wierszy nie będzie korzystało z tego indeksu, który jest liczbą w rows. Ten krok nie jest jeszcze nazywany filtrowaniem.

Następnie te 174 wiersze należy sprawdzić pod kątem dodatkowych warunków (zwykle w whereklauzuli). MySQL szacuje teraz, że tylko 32 wiersze, więc 18% z tych 174 wierszy pozostanie po zastosowaniu tego filtra. Te 18% jest wartością w filtered.

Chociaż oczywiście lepiej jest mieć 32 wiersze zamiast 174 (jeśli np. Będziesz musiał później joinje z inną tabelą), „idealny” indeks dałby ci te 32 wiersze bezpośrednio z początkowego wyszukiwania, oszczędzając czas na przeglądanie i odfiltruj 82% wszystkich potencjalnych wierszy.

Niska wartość może więc oznaczać, że może istnieć lepszy indeks: np. Pełne skanowanie tabeli za pomocą rows=1000i filtered=0.1%może stać się wyszukiwaniem indeksu za pomocą rows=1i filtered=100%jeśli dodasz dobry indeks.

Z drugiej strony, można bardzo dobrze całkowicie zignorować ten filtered-value (który jest w większości przypadków bardzo złe oszacowanie tak), i skupić się na innych ważniejszych kolumn (w szczególności type, keyi extra), aby zoptymalizować zapytanie. Lepiej np. Pozbyć się filesort(np. Stosując indeks, który spełnia order by), nawet jeśli skutkuje to niższą filteredwartością. A lepsze typemoże skutkować ogromną poprawą wydajności, nawet jeśli nie może się zmienić lub nawet obniżyć filtered. W powyższym przykładzie zfiltered=0.1% , type=allbyłoby już wystarczające, aby wskazać, że możesz ulepszyć to zapytanie, dodając indeks, nie patrząc filteredwcale.

Więc nie bierz tej wartości zbyt poważnie: ani nie 100oznacza to, że twoje indeksy są dobre, ani też mniejsza wartość niekoniecznie wskazuje złe indeksy. typejest do tego znacznie lepszym wskaźnikiem.

Rozbłysk słoneczny
źródło
1
Dziękuję za wyjaśnienie. Wiele mi to wyjaśnia. Myślę, że jest to przydatne do utrzymania i wyboru dobrego indeksu
Iman Tumorang
@ImanTumorang Dodałem uwagę i przykłady na ten temat: nie bierz tej wartości zbyt poważnie. Możesz zoptymalizować swoje zapytanie, po prostu patrząc na typei extra(co samo w sobie jest sztuką); możesz żyć bez filtered, ale nie bez type.
Solarflare
W porządku. Mam to. Przeczytałem już to w Mysql Docs, jak wpływają one na wydajność. Dzięki za wyjaśnienie: D
Iman Tumorang
Kolejna wskazówka: przefiltrowane obliczenia są pomijane dla ostatniej dołączonej tabeli. to znaczy pokaże 100%, nawet jeśli w rzeczywistości istnieją warunki, które odfiltrują niektóre z badanych wierszy. Uzasadnieniem jest to, że oszacowanie współczynnika filtrowania kosztuje coś, a to nie wpłynie na plan wykonania zapytania, jeśli znajduje się on w ostatniej tabeli, więc domyślnie pomijają obliczenia.
Bill Karwin