MySQL解釋中過濾的含義是什麼?
如MySQL 文件中所述:
過濾列表示將按表條件過濾的表行的估計百分比。也就是說, rows 顯示檢查的估計行數, rows × filters / 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 將首先嘗試使用索引,例如使用-key
range
對您的表進行掃描。它估計使用該索引可以獲得 174 行,這是. 此步驟尚未稱為過濾。a``search``rows
之後,必鬚根據附加條件檢查這 174 行(通常在您的 -
where
子句中)。MySQL 現在估計只有 32 行,因此這 174 行中的 18% 將在應用該過濾器後保留。這 18% 是 中的值filtered
。雖然擁有 32 行而不是 174 行顯然更好(例如,如果您必須稍後
join
使用另一個表),但“完美”索引會直接從初始搜尋中為您提供這 32 行,從而節省您查看的時間並過濾掉所有潛在行的 82%。因此,較低的值可能表明可能存在更好的索引:例如,如果您添加了一個好的索引,則使用 and 的全表掃描可能會
rows=1000
成為filtered=0.1%
索引查找。rows=1``filtered=100%
另一方面,您可以完全忽略此
filtered
值(無論如何,在大多數情況下,這是一個非常糟糕的估計),並專注於其他更重要的列(尤其是type
,key
和extra
)來優化您的查詢。例如,最好去掉 afilesort
(例如通過使用滿足 的索引order by
),即使它會導致較低的filtered
值。更好的type
可以帶來巨大的性能改進,即使它可能不會改變甚至更低filtered
。在上面的範例中,使用filtered=0.1%
,type=all
已經足以表明您可以通過添加索引來改進該查詢,而無需查看filtered
。所以不要太認真地對待這個值:既不
100
意味著你的索引是好的,一個較低的值也不一定表示壞的索引。type
是一個更好的指標。