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