当签入解释计划时,MYSQL 使用 JOIN TYPE 'ALL'

Nav*_*mar 1 mysql explain

查询如下,

select *
from lab this_ 
inner join visits v1_ on this_.visit_id=v1_.id
Run Code Online (Sandbox Code Playgroud)

v1_.id 是查询中的主键。

完成需要1分多钟。

下面是计划。

id   select_type   table   type  possible_keys  key       
1      SIMPLE       v1_     ALL    <null>      <null>
1      SIMPLE      this_    ALL    <null>      <null>
Run Code Online (Sandbox Code Playgroud)

不知道为什么主键被选为键。类型也是 ALL。

Sha*_*dow 5

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

  1. 桌子的大小。如果访问表很小,那么使用索引没有太大意义。

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

  3. 联接另一侧的字段上的索引。您没有提及labs.visit_id字段是否已编入索引。如果不是,则再次使用访问表的 pk 获得的收益较少。

生成结果的速度不依赖于使用的索引,还取决于结果集的大小(记录和字段数)、mysql 配置以及底层系统的整体性能。尽管如此,如果您认为 mysql 应该使用访问表的 pk,那么在查询中使用索引提示来强调应该使用索引。您可以检查explainmysql 是否受到索引提示的影响。