我想了解Describe語句的輸出。Mysql描述查詢行估計
考慮一個查詢:Describe Select 1 from TableName where attr1='Val1' and attr2='Val2'
一個輸出Explained Here是「行」,其估計將上執行具有相同where子句(attR1位=「VAL1」和attR2選擇查詢來訪問的行數的= 'VAL2')。 這個估計是如何完成的?
感謝
我想了解Describe語句的輸出。Mysql描述查詢行估計
考慮一個查詢:Describe Select 1 from TableName where attr1='Val1' and attr2='Val2'
一個輸出Explained Here是「行」,其估計將上執行具有相同where子句(attR1位=「VAL1」和attR2選擇查詢來訪問的行數的= 'VAL2')。 這個估計是如何完成的?
感謝
EXPLAIN SELECT ...
說明其中的表(在JOIN
)會感動,什麼指數(ES),如果有的話,將被使用的順序。
Rows
是一種近似值,它來自以各種方式收集的統計數據,而不是非常精確。 ANALYZE TABLE
是一種使系統重新計算統計數據的方法。如果您有LIMIT
,那麼Rows
有時會出現嚴重錯誤。
如果你有UNIQUE(attr1, attr2)
它可能足夠聰明地說1
爲Rows
。有N個值和統計數據的表格,attr1和B不同的attr2值 - Rows
可能類似於A * B/N。但是,如果Val1
和Val2
是常見(或罕見)值,則此計算可能很遙遠。
在一些情況下,優化器將使探針進入索引來估計有多少行Val1
等。由於這樣做動態(未靜態,與一些其它的產品),EXPLAIN
(並且因此查詢計劃)可能會根據值而有所不同。 (我已經看到多達6個不同的查詢計劃,這些查詢計劃對於SELECT
僅在常量上有所不同。)
EXPLAIN FORMAT=JSON SELECT ...
(在5.6中)給出了更多詳細信息。 「優化器跟蹤」提供了更多細節。
attr1='Val1' and attr2='Val2'
想這些中的一個,按優先順序排列:
INDEX(attr1, attr2, ...)
或INDEX(attr2, attr1, ...)
如果要麼存在;這是最佳的;或INDEX(attr1, ...)
或INDEX(attr2, ...)
;它會根據選擇性進行選擇,或者如果有ORDER BY
,可能會發生其他情況。
如果索引「覆蓋」查詢,則EXPLAIN
表示Using index
。例如,可能會使用INDEX(attr3, attr1, attr2)
,即使必須掃描整個索引 - SELECT attr3 FROM t WHERE attr1='Val1' and attr2='Val2'
。
如果您想討論某個特定的查詢,請將其呈現。 全部部分查詢可能影響EXPLAIN
說什麼。
Here是關於如何構建最優索引的一些基本規則。
我在MySQL和/或Oracle上使用「解釋」的主要原因是爲了瞭解特定查詢的價格,以及如何優化查詢。我可以做出的主要建議是使用Explain來確定where子句中是否存在與未索引的值(列)相匹配的條件。當where子句條件必須檢查表中的每一行(全表掃描)時,該查詢會執行額外的工作。如果where子句中的所有條件都不符合索引值,則查詢將更快地返回。 – mba12