Quelle est la signification de filtré dans MySQL expliquer?

21

Comme décrit ici dans les documents MySQL :

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

Iman Tumorang
la source

Réponses:

30

Filtrer ici signifie appliquer une condition sur un ensemble de lignes sélectionnées par une typerecherche en tant que lignes potentielles et ne conserver que les lignes qui remplissent la condition:

MySQL essaiera d'abord d'utiliser un index, par exemple, effectuez une rangeanalyse sur votre table en autilisant la searchtouche. Il estime qu'il faut 174 lignes pour utiliser cet indice, qui est le nombre 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 whereclause). 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 en filtered.

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

Ainsi, une valeur faible pourrait indiquer qu'il pourrait y avoir un meilleur index: par exemple, une analyse complète de la table avec rows=1000et filtered=0.1%pourrait devenir une recherche d'index avec rows=1et 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, keyet extra) pour optimiser votre requête. Il peut par exemple être préférable de se débarrasser de a filesort(par exemple en utilisant un indice qui satisfait le order by), même si cela se traduit par une filteredvaleur inférieure . Et une meilleure typepeut entraîner une énorme amélioration des performances, même si elle ne change pas ou même moins filtered. Dans l'exemple ci-dessus avec filtered=0.1%, type=allaurait déjà suffi pour indiquer que vous pourriez être en mesure d'améliorer cette requête en ajoutant un index, sans regarder filtereddu tout.

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

Éruption solaire
la source
1
Merci pour l'explication. Ça m'explique beaucoup. Je pense que c'est utile pour maintenir et sélectionner le bon indice
Iman Tumorang
@ImanTumorang J'ai ajouté une remarque et des exemples à ce sujet: ne prenez pas cette valeur trop au sérieux. Vous pouvez optimiser votre requête en regardant simplement typeet extra(qui est un art en soi); vous pourriez vivre sans filtered, mais pas sans type.
Solarflare
Bon alors. J? ai compris. Je l'ai déjà lu dans les documents Mysql, comment ils affectent les performances. Merci pour votre explication: D
Iman Tumorang
Autre astuce: le calcul filtré est ignoré pour la dernière table jointe. c'est-à-dire qu'il affichera 100% même s'il existe en fait des conditions qui filtreront certaines des lignes examinées. La raison en est qu'il en coûte quelque chose pour estimer le facteur de filtrage, et cela n'affectera pas le plan d'exécution des requêtes s'il se trouve sur la dernière table, donc ils ignorent par défaut le calcul.
Bill Karwin