web-dev-qa-db-fra.com

Quelle est la signification de filtré dans MySQL expliquer?

Comme décrit ici dans les MySQL docs :

La colonne filtrée indique un pourcentage estimé de lignes de tableau qui seront filtrées par la condition du tableau. En d'autres termes, les lignes indiquent le nombre estimé de lignes examinées et les lignes × filtrées/100 indiquent le nombre de lignes qui seront jointes aux tables précédentes. Avant MySQL 5.7.3, cette colonne s'affiche si vous utilisez EXPLAIN EXTENDED. Depuis MySQL 5.7.3, la sortie étendue est activée par défaut et le mot clé EXTENDED n'est pas nécessaire.

Je ne comprends toujours pas. Quelle est la signification de "filtré" ici? Quelles informations pouvons-nous obtenir de cette colonne?

Par exemple, lorsque je commence à interroger, certaines requêtes afficheront 100 et d'autres afficheront 18 ou moins que 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 |

Quel est le principal point que nous pouvons conclure de cette valeur?

Est-il dit que la colonne n'a filtré que 18%? Ou si plus le score est bas, plus l'indice/la requête est bon?

J'utilise MySQL 5.7

23
Iman Tumorang

Pour filtrer signifie ici appliquer une condition sur un ensemble de lignes qui ont été sélectionnées par une recherche type- comme lignes potentielles, et ne conserver que les lignes qui remplissent la condition:

MySQL essaiera d'abord d'utiliser un index, par exemple effectuez une analyse range sur votre table a à l'aide de la touche search-. Il estime qu'il faut 174 lignes pour utiliser cet index, qui est le nombre dans rows. Cette étape n'est pas encore appelée filtrage.

Après cela, ces 174 lignes doivent être vérifiées par rapport à des conditions supplémentaires (généralement dans votre clause where-). MySQL estime désormais qu'il ne restera que 32 lignes, soit 18% de ces 174 lignes, après l'application de ce filtre. Ce 18% est la valeur dans filtered.

Bien qu'il soit évidemment préférable d'avoir 32 lignes au lieu de 174 (si vous devez par exemple les join plus tard avec une autre table), un index "parfait" vous aurait donné ces 32 lignes directement à partir de la recherche initiale, en économisant vous le temps de regarder et de filtrer 82% de toutes les lignes potentielles.

Une valeur faible pourrait donc indiquer qu'il pourrait y avoir un meilleur indice: par exemple une analyse complète de la table avec rows=1000 et filtered=0.1% pourrait devenir une recherche d'index avec rows=1 et filtered=100% si vous ajoutez un bon index.

D'un autre côté, vous pouvez très bien ignorer complètement cette valeur filtered- (qui est dans la plupart des cas une très mauvaise estimation de toute façon), et vous concentrer sur les autres colonnes plus importantes (en particulier type, key et extra) pour optimiser votre requête. Il peut par exemple mieux vaut se débarrasser d'un filesort (par exemple en utilisant un index qui satisfait le order by), même si cela se traduit par une valeur filtered inférieure. Et une meilleure type peut entraîner une énorme amélioration des performances, même si elle ne change pas ou même baisse filtered. Dans l'exemple ci-dessus avec filtered=0.1%, type=all aurait déjà suffi pour indiquer que vous pourriez être en mesure d'améliorer cette requête en ajoutant un index, sans regarder filtered du tout.

Ne prenez donc pas cette valeur trop au sérieux: 100 signifie que vos index sont bons, et une valeur inférieure n'indique pas nécessairement de mauvais index. type est un bien meilleur indicateur pour cela.

33
Solarflare