2016-04-14 49 views
0

我想了解Describe語句的輸出。Mysql描述查詢行估計

考慮一個查詢:Describe Select 1 from TableName where attr1='Val1' and attr2='Val2'

一個輸出Explained Here是「行」,其估計將上執行具有相同where子句(attR1位=「VAL1」和attR2選擇查詢來訪問的行數的= 'VAL2')。 這個估計是如何完成的?

感謝

+0

我在MySQL和/或Oracle上使用「解釋」的主要原因是爲了瞭解特定查詢的價格,以及如何優化查詢。我可以做出的主要建議是使用Explain來確定where子句中是否存在與未索引的值(列)相匹配的條件。當where子句條件必須檢查表中的每一行(全表掃描)時,該查詢會執行額外的工作。如果where子句中的所有條件都不符合索引值,則查詢將更快地返回。 – mba12

回答

1

EXPLAIN SELECT ...說明其中的表(在JOIN)會感動,什麼指數(ES),如果有的話,將被使用的順序。

Rows是一種近似值,它來自以各種方式收集的統計數據,而不是非常精確。 ANALYZE TABLE是一種使系統重新計算統計數據的方法。如果您有LIMIT,那麼Rows有時會出現嚴重錯誤。

如果你有UNIQUE(attr1, attr2)它可能足夠聰明地說1Rows。有N個值和統計數據的表格,attr1和B不同的attr2值 - Rows可能類似於A * B/N。但是,如果Val1Val2是常見(或罕見)值,則此計算可能很遙遠。

在一些情況下,優化器將使探針進入索引來估計有多少行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是關於如何構建最優索引的一些基本規則。