我想了解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