MYSQL在签入解释计划时使用连接类型“ALL”

MYSQL在签入解释计划时使用连接类型“ALL”,mysql,explain,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

查询如下:

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>

不确定为什么主键被选为键。类型也是全部

Mysql可能会在执行查询时忽略索引,如果它认为替代方案更有效。它考虑了以下几点:

桌子的大小。如果vists表很小,那么使用索引就没有太多意义

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

在联接另一侧的字段上建立索引。您没有提到labs.visit\u id字段是否已编制索引。如果不是,那么使用访问表的pk也会减少收益


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

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

桌子的大小。如果vists表很小,那么使用索引就没有太多意义

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

在联接另一侧的字段上建立索引。您没有提到labs.visit\u id字段是否已编制索引。如果不是,那么使用访问表的pk也会减少收益


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

主键被选为键-您在哪里看到它?主键被选为键-您在哪里看到它?感谢您的建议。1.生命表很大。2.我只需要id和访问表中的一个字段。3.实验室表中有访问id的索引。相同的表、相同的结构、几乎相同的行数在另一个环境中有效地工作。可能与一些mysql配置有关吗。然后仅选择这两个字段,而不是每个字段。3.如果这两个表的行数几乎相同,那么可能这就是原因。请参阅我的第二点:MySQL必须从访问表中检索大部分记录。你还说它在另一个环境中有效地工作。在其他环境中也运行解释。如果mysql在那里使用pk,那么尝试建议的索引提示。我无法告诉您性能差异是否与MySQL设置有关,因为我对MySQL配置或服务器一无所知。首先尝试索引提示。谢谢您的建议。1.生命表很大。2.我只需要id和访问表中的一个字段。3.实验室表中有访问id的索引。相同的表、相同的结构、几乎相同的行数在另一个环境中有效地工作。可能与一些mysql配置有关吗。然后仅选择这两个字段,而不是每个字段。3.如果这两个表的行数几乎相同,那么可能这就是原因。请参阅我的第二点:MySQL必须从访问表中检索大部分记录。你还说它在另一个环境中有效地工作。在其他环境中也运行解释。如果mysql在那里使用pk,那么尝试建议的索引提示。我无法告诉您性能差异是否与MySQL设置有关,因为我对MySQL配置或服务器一无所知。首先尝试索引提示。