好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

号外,left join比连表语句快80倍

号外,left join比连表语句快80倍

理论上,这两句话是等价的:

 SELECT   *   FROM   inscription_pan 
  LEFT   JOIN   facture_pan
  ON   (ins_id =  fc_inscription)
  AND  (ins_ecole =  fc_ecole)
  WHERE  (ins_date >=  '  2013-06-01  '  )
  AND  (ins_date <=  '  2013-06-11  '  )
  and  (ins_operateur_id =  74 )

等价于

 SELECT   *   FROM   inscription_pan , facture_pan
  where   (ins_id =  fc_inscription)
  AND  (ins_ecole =  fc_ecole)
  and  (ins_date >=  '  2013-06-01  '  )
  AND  (ins_date <=  '  2013-06-11  '  )
  and  (ins_operateur_id =  74 ) 

但是前者执行需要0.25秒,后者需要20.547秒。得出却是相同的结果。80倍都不止。

原因我想可能是因为前者是简单的一对多的关系,以左边为准,只要补充右边的数据即可;而后者是多对多的关系,因而有无穷多的可能性,需要一一演算。但是具体对于这个业务来说,不存在多对多的关系,基本上也是1对多的关系。所以非常快速。

真正的原因:除了对应关系以外,WHERE语句三个条件都是inscription的。因此前者SQL先排除,后对应;后者SQL先对应,后排除,数据量大大增加。

额外的总结:Left join=笛卡尔乘积+对应不到的数据用NULL显示

查看更多关于号外,left join比连表语句快80倍的详细内容...

  阅读:48次