为什么选择count()使用左连接这么慢

时间:2016-07-01 18:05:50

标签: mysql performance count left-join

这是我的sql:

select count(*) 
from goods g 
left join goods_policy s 
      on g.com_uid = s.com_uid
     AND g.goods_uid = s.goods_uid 
WHERE g.com_uid = '123'

每张表中只有2000条记录,但成本超过4秒。 解释如下:

1   SIMPLE  g   ref AK_GOOD_CODE,GOODS_IDX_COM,GOODS_IDX_STATUS GOODS_IDX_COM   98  const   1272    Using where; Using index
1   SIMPLE  s   ref PRIMARY PRIMARY 98  biz_1.g.COM_UID 2   Using where; Using index

表goods_policy有三个字段,com_uid,goods_uid和policy_uid,而表商品有com_uid,goods_uid和其他有关商品本身的字段。

如果我使用内连接,只需0.01秒就可以得到相同的解释结果。

为什么离开加入会花费这么多时间,我该如何改进这个SQL。

编辑: 以下是两个表中的行:

select count(*) from goods;2827
select count(*) from GOODS_POLICY; 2729

以下是索引:

goods   0   PRIMARY 1   GOODS_UID   A   2544                BTREE       
goods   0   AK_GOOD_CODE    1   COM_UID A   14              BTREE       
goods   0   AK_GOOD_CODE    2   GOODS_CODE  A   2544                BTREE       
goods   0   AK_GOOD_CODE    3   STATUS  A   2544            YES BTREE       
goods   1   GOODS_IDX_COM   1   COM_UID A   14              BTREE       

goods_policy    0   PRIMARY 1   COM_UID A   1364                BTREE       
goods_policy    0   PRIMARY 2   POLICY_UID  A   2729                BTREE       
goods_policy    0   PRIMARY 3   GOODS_UID   A   2729                BTREE       

4 个答案:

答案 0 :(得分:0)

删除where子句并将其添加到join中然后它将在join之前执行该slect并且它将仅连接所选的一组结果

select count(*) from goods g left join 
 goods_policy s on s.com_uid = '123' AND 
g.goods_uid = s.goods_uid and g.com_uid = '123'

答案 1 :(得分:0)

尝试使用复合索引

<img src="cid:xyz">

之后也尝试使用@Mahesh Sugestion

CREATE TABLE goods (
    ...
    PRIMARY KEY (com_uid ),
    INDEX goods (com_uid , goods_uid )
);

CREATE TABLE goods_policy (
    ...
    PRIMARY KEY (goods_uid),
    INDEX goods_policy (com_uid , goods_uid )
);

答案 2 :(得分:0)

重新排列,在goods_policy中:

PRIMARY KEY(com_uid, goods_uid, policy_uid)

这将使JOIN更有效率。

(但它没有说明你是在计算正确的事情,也不是LEFT是否需要。我强烈怀疑其中一个或两个都是错的。)

在进一步讨论之前请提供SHOW CREATE TABLE

答案 3 :(得分:0)

通过在com_uid,policy_uid和goods_uid上添加索引,解决了问题。