这是我的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
答案 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上添加索引,解决了问题。