(1)嵌套循环关联:
嵌套连接不能连接查询太多表的原因
简单来说,假设有两个表要一起执行关联,此时会先在一个驱动表里根据他的where 筛选条件找出一批数据,比如找出10条数据,接着就对这10条数据走一个循环,因为每条数据都
到另一个被驱动表里根据 ON 连接条件和WHERE里的被驱动表筛选条件去查找数据,找出来的数据就进行关联。
假设驱动表里找出来10条数据,那么就要到被驱动表里去查询10次,如果是三个表进行关联呢?就更夸张了,从表1里查出来10条数据,接着去表2里查10次。假设每次都查出3条数据,然后
关联起来,此时会得到一个30条数据的结果集,接着再用这批数据去表3里继续查询30次。
那这多表关联方法的问题在哪里?
没错,就是从驱动表查出来一批数据后,要对每一条数据都循环一次去被驱动表里查询数据,所以万一被驱动表的索引都没建好,总不能每次都全表扫描吧,这就是很大一个问题。另外
刚开始驱动表根据where条件查询的时候,也总不能全表扫描吧,所以说,为什么有的多表关联很慢呢?答案就在这,两个表关联,先从驱动表里根据WHERE条件筛选一批数据,这个过程如果没给驱动表
加索引,万一走一个all全表扫描,速度很慢。
(2)总结:
其次,通常而言,针对多表查询的语句,尽量给两个表都加上索引,索引确保驱动表查询也是通过索引查找,接着被驱动表查询也通过索引去查找,如果能做到这点,多表关联语句性能也很高。
这也是使用left join 不超过4个的原因,不能太多,太多嵌套查询太多。