mysql多表连接采用block nested loop算法,即循环嵌套连接:将驱动表的结果集作为循环基础数据,然后循环从该结果集每次一条获取数据作为下一个表的过滤条件查询数据,然后合并结果。如果有多表join,则将前面的表的结果集作为循环数据,取到每行再到联接的下一个表中循环匹配。驱动表的选择对性能影响很大。一般情况下,驱动表数据越少效率越高,即用小表驱动大表效率比较高。mysql会对我们写的sql语句进行优化,优化器会尽量使用最小的结果集(on和where过滤之后的临时表)最为驱动表。因为我们写在最前面的表不一定是驱动表,具体要看explain结果。
如果大表筛选条件没有索引,小表有索引,mysql会用大表驱动小表。因此大表筛选条件建立索引很重要。