Mysql

MySQL解釋中過濾的含義是什麼?

  • March 14, 2022

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 將首先嘗試使用索引,例如使用-keyrange對您的表進行掃描。它估計使用該索引可以獲得 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,keyextra)來優化您的查詢。例如,最好去掉 a filesort(例如通過使用滿足 的索引order by),即使它會導致較低的filtered值。更好的type可以帶來巨大的性能改進,即使它可能不會改變甚至更低filtered。在上面的範例中,使用filtered=0.1%,type=all已經足以表明您可以通過添加索引來改進該查詢,而無需查看filtered

所以不要太認真地對待這個值:既不100意味著你的索引是好的,一個較低的值也不一定表示壞的索引。type是一個更好的指標。

引用自:https://dba.stackexchange.com/questions/164251