MySQL docs で説明されているように:
フィルタリングされた列は、テーブル条件によってフィルタリングされるテーブル行の推定割合を示します。つまり、行は検査された行の推定数を示し、行×フィルター処理済み/ 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を使用しています
フィルタリングするここでは、type
- searchによって選択された一連の行に条件を適用して、条件に合う行のみを保持することを意味します。
MySQLは最初にインデックスを使用しようとします。 range
- keyを使用して、テーブルでa
スキャンsearch
を実行します。 rows
の数値であるそのインデックスを使用して174行を取得すると推定されます。このステップはまだフィルタリングと呼ばれていません。
その後、これらの174行を追加の条件(通常はwhere
句で)に対してチェックする必要があります。 MySQLは、フィルターが適用された後、32行のみ、つまりこれらの174行の18%が残ると推定しました。この18%はfiltered
の値です。
明らかに174ではなく32行にする方が良い(たとえば、後で別のテーブルでそれらをjoin
する必要がある場合)、「完全な」インデックスはこれらの32行を最初の検索から直接与え、保存しますすべての潜在的な行の82%を調べて除外する時間です。
したがって、低い値は、より良いインデックスがあることを示している可能性があります。 rows=1000
およびfiltered=0.1%
を使用した全テーブルスキャンは、適切なインデックスを追加すると、rows=1
およびfiltered=100%
を使用したインデックスルックアップになる可能性があります。
一方、このfiltered
- value(ほとんどの場合、非常に悪い見積もりです)を完全に無視して、他のより重要な列(特にtype
、 key
およびextra
)を使用してクエリを最適化します。たとえば、 filesort
の値が低くなる場合でも、filtered
を削除することをお勧めします(たとえば、order by
を満たすインデックスを使用する)。そして、より良いtype
は、変更されない場合やfiltered
を低くする場合でも、パフォーマンスが大幅に向上する可能性があります。上記のfiltered=0.1%
の例では、filtered
をまったく見なくても、インデックスを追加することでそのクエリを改善できる可能性があることを示すにはtype=all
で十分です。
したがって、その値をあまり真剣に受け取らないでください。100
は、インデックスが良好であることを意味するわけではなく、低い値が必ずしも不良なインデックスを示しているわけでもありません。 type
はそのためのはるかに優れた指標です。