一方面,有说法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进行过滤
这两种说法就有矛盾,怎么回事?
如果没有指定驱动表,mysql优化器会自己选一个吧(这一步应该是单纯的优化sql,还没执行?)。
,优化完之后,具体sql的执行顺序,我觉得还是先on 在where过滤