我想了解Describe声明的输出。
考虑一个查询:Describe Select 1 from TableName where attr1='Val1' and attr2='Val2'
其中一个输出Explained Here是"行"它估计在执行select子查询时将访问的行数与子句相同(attr1 =' Val1'和attr2 =' Val2')。 这个估算是如何完成的?
由于
答案 0 :(得分:1)
EXPLAIN SELECT ...
解释了表格(在JOIN
中)将被触及的顺序以及将使用的索引(如果有的话)。
Rows
是来自统计数据的近似值,这些统计数据以各种方式收集,而不是非常精确。 ANALYZE TABLE
是一种使系统重新计算统计信息的方法。如果你有一个LIMIT
,那么Rows
有时会非常错误。
如果您有UNIQUE(attr1, attr2)
,那么对1
说Rows
可能足够聪明。一个包含N值和统计数据的表,表示attr2的明确值和attr2的不同值 - Rows
可能类似于A * B / N.但是,如果Val1
和Val2
是常见(或罕见)值,则此计算可能很遥远。
在某些情况下,优化器会对索引进行探测,以估计行数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
,则可能会发生其他事情。
如果索引"涵盖"然后查询EXPLAIN
说Using index
。例如,即使必须扫描整个索引,也可以使用INDEX(attr3, attr1, attr2)
- SELECT attr3 FROM t WHERE attr1='Val1' and attr2='Val2'
。
如果您想讨论特定查询,请提供它。 查询的所有部分可能会影响EXPLAIN
所说的内容。
Here是关于如何构建最佳索引的一些基本规则。