设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 站长学院 > MySql教程 > 正文

8种你可能正在写错的SQL用法(8)

发布时间:2019-07-22 15:59 所属栏目:115 来源:佚名
导读:再来看下面这个已经初步优化过的例子(左连接中的主表优先作用查询条件): SELECTa.*, c.allocated FROM( SELECTresourceid FROMmy_distributed WHEREisdelete=0 ANDcusmanagercode='1234567' ORDERBYsalecodelimit2

再来看下面这个已经初步优化过的例子(左连接中的主表优先作用查询条件):

  1. SELECT    a.*,   
  2.           c.allocated   
  3. FROM      (   
  4.               SELECT   resourceid   
  5.               FROM     my_distribute d   
  6.                    WHERE    isdelete = 0   
  7.                    AND      cusmanagercode = '1234567'   
  8.                    ORDER BY salecode limit 20) a   
  9. LEFT JOIN   
  10.           (   
  11.               SELECT   resourcesid, sum(ifnull(allocation, 0) * 12345) allocated   
  12.               FROM     my_resources   
  13.                    GROUP BY resourcesid) c   
  14. ON        a.resourceid = c.resourcesid 

那么该语句还存在其它问题吗?不难看出子查询 c 是全表聚合查询,在表数量特别大的情况下会导致整个语句的性能下降。

其实对于子查询 c,左连接最后结果集只关心能和主表 resourceid 能匹配的数据。因此我们可以重写语句如下,执行时间从原来的2秒下降到2毫秒。

  1. SELECT    a.*,   
  2.           c.allocated   
  3. FROM      (   
  4.                    SELECT   resourceid   
  5.                    FROM     my_distribute d   
  6.                    WHERE    isdelete = 0   
  7.                    AND      cusmanagercode = '1234567'   
  8.                    ORDER BY salecode limit 20) a   
  9. LEFT JOIN   
  10.           (   
  11.                    SELECT   resourcesid, sum(ifnull(allocation, 0) * 12345) allocated   
  12.                    FROM     my_resources r,   
  13.                             (   
  14.                                      SELECT   resourceid   
  15.                                      FROM     my_distribute d   
  16.                                      WHERE    isdelete = 0   
  17.                                      AND      cusmanagercode = '1234567'   
  18.                                      ORDER BY salecode limit 20) a   
  19.                    WHERE    r.resourcesid = a.resourcesid   
  20.                    GROUP BY resourcesid) c   
  21. ON        a.resourceid = c.resourcesid 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读