Mysql描述查询行估计

时间:2016-04-14 20:22:33

标签: mysql sql query-performance

我想了解Describe声明的输出。

考虑一个查询:Describe Select 1 from TableName where attr1='Val1' and attr2='Val2'

其中一个输出Explained Here是"行"它估计在执行select子查询时将访问的行数与子句相同(attr1 =' Val1'和attr2 =' Val2')。 这个估算是如何完成的?

由于

1 个答案:

答案 0 :(得分:1)

EXPLAIN SELECT ...解释了表格(在JOIN中)将被触及的顺序以及将使用的索引(如果有的话)。

Rows是来自统计数据的近似值,这些统计数据以各种方式收集,而不是非常精确。 ANALYZE TABLE是一种使系统重新计算统计信息的方法。如果你有一个LIMIT,那么Rows有时会非常错误。

如果您有UNIQUE(attr1, attr2),那么对1Rows可能足够聪明。一个包含N值和统计数据的表,表示attr2的明确值和attr2的不同值 - Rows可能类似于A * B / N.但是,如果Val1Val2是常见(或罕见)值,则此计算可能很遥远。

在某些情况下,优化器会对索引进行探测,以估计行数Val1等等。因为这是动态(不是静态的,与其他一些产品一样) ),EXPLAIN(以及查询计划)可能会根据值而有所不同。 (我已经看到SELECT的6个不同的查询计划只有常数不同。)

EXPLAIN FORMAT=JSON SELECT ...(在5.6中)提供了更多详细信息。 "优化器跟踪"提供更多细节。

attr1='Val1' and attr2='Val2'按照优先顺序选择其中一个:

    如果存在,则
  • INDEX(attr1, attr2, ...)INDEX(attr2, attr1, ...);这是最佳的;或
  • INDEX(attr1, ...)INDEX(attr2, ...);它会根据选择性选择,或
  • 表扫描,如果上述索引都不存在,或者统计数据表明索引不值得使用。

如果有ORDER BY,则可能会发生其他事情。

如果索引"涵盖"然后查询EXPLAINUsing index。例如,即使必须扫描整个索引,也可以使用INDEX(attr3, attr1, attr2) - SELECT attr3 FROM t WHERE attr1='Val1' and attr2='Val2'

如果您想讨论特定查询,请提供它。 查询的所有部分可能会影响EXPLAIN所说的内容。

Here是关于如何构建最佳索引的一些基本规则。