2016-04-14 48 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是关于如何构建最优索引的一些基本规则。