MySQL Explainのフィルター処理の意味は何ですか?


21

ここにMySQLドキュメントで説明されているように:

フィルター処理された列は、テーブル条件によってフィルター処理されるテーブル行の推定パーセンテージを示します。つまり、rowsは調べた行の推定数を示し、rows×Filtered / 100は前のテーブルと結合される行数を示します。MySQL 5.7.3より前では、EXPLAIN EXTENDEDを使用すると、この列が表示されます。MySQL 5.7.3の時点では、拡張出力はデフォルトで有効になっており、EXTENDEDキーワードは不要です。

まだわかりません。ここで「フィルタリング」の意味は何ですか?このコラムからどのような情報を入手できますか?

たとえば、クエリを開始すると、一部のクエリには100が表示され、他のクエリには18または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 |

この値から結論付けることができる主なポイントは何ですか?

それは、列が18%だけをフィルタリングしたということですか?または、スコアが低いほど、インデックス/クエリの品質が向上しますか?

MySQL 5.7を使用しています

回答:


30

ここでフィルター処理するとは、type-searchによって潜在的な行として選択された行のセットに条件を適用し、条件を満たす行のみを保持することを意味します。

MySQLは最初にインデックスの使用を試みます。たとえば、-key を使用rangeしてテーブルaをスキャンしますsearch。そのインデックスの使用から174行を取得すると推定されますrows。これはの数です。このステップはまだフィルタリングと呼ばれていません。

その後、これらの174行を追加条件(通常はwhere-clause)でチェックする必要があります。MySQLは現在、32行のみであるため、この174行の18%がそのフィルターが適用された後に残ると推定しています。この18%はの値ですfiltered

174の代わりに32行を使用する方が明らかに良い(たとえば、後でjoin別のテーブルを使用する必要がある場合)が、「完全な」インデックスによってこれらの32行が最初の検索から直接得られるため、時間を節約できますすべての潜在的な行の82%を除外します。

と例えばA全表スキャン:低い値がより良い指標になり得ることを示しているかもしれないので、rows=1000filtered=0.1%してインデックス検索をなるかもしれないrows=1し、filtered=100%あなたは良いインデックスを追加した場合。

一方、このfiltered-value(ほとんどの場合、非常に悪い推定値です)を完全に無視し、クエリを最適化するために他のより重要な列(特にtypekeyおよびextra)に焦点を合わせることができます。たとえば、より低い値になった場合でも、filesort(たとえば、を満たすインデックスを使用することでorder by)を取り除く方が良い場合がありfilteredます。そして、より良いものtypeは、たとえそれが変化しなかったり、さらには低下しfilteredたとしても、パフォーマンスが大幅に改善される可能性があります。上記の例filtered=0.1%type=allは、を見て、インデックスを追加することでそのクエリを改善できる可能性があることを示すには、すでに十分ですfiltered

そのため、その値をあまり真剣に受け取らない100でください。インデックスが良好であることを意味するわけでも、値が低いほどインデックスが不良であることを示すわけでもありません。typeそれははるかに良い指標です。


1
説明してくれてありがとう。それは私のためにたくさん説明しています。良いインデックスの維持と選択に役立つと思う
イマントゥモラン

@ImanTumorang発言とそれについての例を追加しました:その値をあまり真剣に受け取らないでください。typeand extra(それ自体が芸術です)を見るだけでクエリを最適化できます。あなたはなしfilteredで生きることができましたが、なしではできませんtype
Solarflare

じゃあオーケー。わかった。私はすでにMysql Docsでそれを読んで、それらがパフォーマンスにどのように影響するかを説明しました。説明ありがとうございます:D
イマントゥモラン

別のヒント:フィルターされた計算は、最後に結合されたテーブルでスキップされます。つまり、調査された行の一部を除外する条件が実際に存在する場合でも、100%が表示されます。その理由は、フィルタリング係数を推定するのにいくらかのコストがかかることであり、最後のテーブルにある場合、クエリ実行プランに影響を与えないため、デフォルトでは計算をスキップします。
ビルカーウィン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.