查询如下,
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。
答案 0 :(得分:3)
如果查询认为替代计划更有效,Mysql可能会在执行查询期间忽略索引。它认为有几点:
表格的大小。如果访问表很小,那么使用索引的意义不大。
选择性。你加入了2个表,但没有过滤,你想要两个表中的所有字段。这可能意味着mysql无论如何都必须返回访问表中的大部分记录,并且索引仅涵盖id列。因此,无论如何,mysql都会被迫扫描访问表的大部分记录以返回数据,因此使用索引获得的收益并不多。
联接另一侧字段的索引。您没有提及array_column()
字段是否已编入索引。如果不是,那么使用访问表的pk就可以获得更少的收益。
生成结果的速度不依赖于使用的索引,它还取决于结果集的大小(记录和字段计数),mysql配置以及底层系统的整体性能。不过,如果你认为mysql应该使用visit表的pk,那么在查询中使用index hint来强调应该使用索引。如果mysql受到索引提示的影响,您可以查看labs.visit_id
。