select * from a join b on a.id=b.a_id中a是否全表扫描?

存在两个表a、b,b中一列a_id作为外键存储a表id且有索引

select * from a join b on a.id=b.a_id

问1:以上sql是否a表全表扫描,b表使用索引?

select * from b join a on a.id=b.a_id

问2:以上sql(join前后a、b顺序对调)是否b表全表扫描,a表使用索引?

阅读 3.5k
5 个回答

除非手动指定驱动表(STRAIGHT_JOIN),否则 mysql 优化器会以代价最小的那个表作为驱动表,所以上面两条语句在没有特殊情况下,结果是一样的,你可以 explain 看一下

就题主给出的sql,如果 a 为驱动表(a的数量比较少),那么 a 会全表扫描,b 的 a_id 能使用索引。当 b 为驱动表也可以这样分析

不一定的 优化器会判断谁做驱动表谁做被驱动表 所以你这两条语句执行方式可能是完全一样的

优化器自己判断驱动表,如果要强制驱动 用STRAIGHT_JOIN

最好不要使用*

1。肯定是全表扫描
2。还产生笛卡尔积

效率及其差。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题