MySQL驱动表和on/where执行顺序的问题

一方面,有说法MySQL使用join的时候,如果有on和where,则先执行on生成临时表,然后用where进行过滤

另一方面,根据MySQL驱动表理论,小表驱动达标,如下语句

select from table_a a join table_b b on a.id=b.cid where a.id > 1000

根据MySQL驱动表理论,如果a.id>1000后a表剩余的行数远小于b,则a为驱动表,根据Nest Loop Join,外层循环是a的a.id>1000的数据行,再去和b比较a.id=b.cid,这就意味着先where后join

但是前面的说法是先执行on生成临时表然后用where进行过滤

这两种说法就有矛盾,怎么回事?

阅读 3.3k
2 个回答

如果没有指定驱动表,mysql优化器会自己选一个吧(这一步应该是单纯的优化sql,还没执行?)。
,优化完之后,具体sql的执行顺序,我觉得还是先on 在where过滤

先on 后where,驱动表不明确指定由mysql优化器自行决定,主要看表数据,而不是where过滤完的

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