存在两个表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表使用索引?
存在两个表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表使用索引?
5 回答3.3k 阅读✓ 已解决
3 回答3.7k 阅读✓ 已解决
2 回答2.9k 阅读✓ 已解决
5 回答1.4k 阅读
2 回答2.1k 阅读
3 回答2k 阅读
1 回答3.6k 阅读
除非手动指定驱动表(
STRAIGHT_JOIN
),否则 mysql 优化器会以代价最小的那个表作为驱动表,所以上面两条语句在没有特殊情况下,结果是一样的,你可以explain
看一下就题主给出的sql,如果 a 为驱动表(a的数量比较少),那么 a 会全表扫描,b 的 a_id 能使用索引。当 b 为驱动表也可以这样分析