在解释计划中检查时,MYSQL使用JOIN TYPE'ALL'

时间:2016-11-09 21:33:35

标签: mysql explain

查询如下,

select *
from lab this_ 
inner join visits v1_ on this_.visit_id=v1_.id

v1_.id是查询中的主键。

完成需要1分钟以上。

以下是计划。

id   select_type   table   type  possible_keys  key       
1      SIMPLE       v1_     ALL    <null>      <null>
1      SIMPLE      this_    ALL    <null>      <null>

不确定为什么选择主键作为键。还输入ALL。

1 个答案:

答案 0 :(得分:3)

如果查询认为替代计划更有效,Mysql可能会在执行查询期间忽略索引。它认为有几点:

  1. 表格的大小。如果访问表很小,那么使用索引的意义不大。

  2. 选择性。你加入了2个表,但没有过滤,你想要两个表中的所有字段。这可能意味着mysql无论如何都必须返回访问表中的大部分记录,并且索引仅涵盖id列。因此,无论如何,mysql都会被迫扫描访问表的大部分记录以返回数据,因此使用索引获得的收益并不多。

  3. 联接另一侧字段的索引。您没有提及array_column()字段是否已编入索引。如果不是,那么使用访问表的pk就可以获得更少的收益。

  4. 生成结果的速度不依赖于使用的索引,它还取决于结果集的大小(记录和字段计数),mysql配置以及底层系统的整体性能。不过,如果你认为mysql应该使用visit表的pk,那么在查询中使用index hint来强调应该使用索引。如果mysql受到索引提示的影响,您可以查看labs.visit_id