mysql left join效率优化

通过下面sql查询商品库存数量,因为库存表里面的库存是很多仓库的库存数据,在left join的时候又要做一个表连接,这样查询的时候效率非常低,如果left join一个表就很快,但是无法满足需求,请大神门帮忙优化下sql,谢谢

select g.*,gsd.number from goods g
left join (select gs.goods_id,sum(gs.number) number from goods_stock gs,warehouses w where gs.warehouse_id=w.id group by gs.goods_id and w.id='123456789') gsw on(g.id=gsd.goods_id)

4个回答

连接时不引入子查询(中间结果利用不了索引),在连接后再进行分组统计,大概的样子如下
SELECT *
FROM
(SELECT *
FROM goods g
LEFT JOIN goods_stock gs
ON g.goods_id = gs.goods_id
LEFT JOIN warehouses w
ON gs.warehouse_id = w.id
WHERE w.id='123456789' ) good
GROUP BY good.goods_id

在gs.warehouse_id、w.id、gs.goods_id、gs.number等关键字段加索引没?

xujiannan1988
xujiannan1988 gs.warehouse_id、w.id、gs.goods_id这几个字段都是主键,都会有索引的,gs.number这个是一个计算的和值,即便是不要这个字段也不影响查询速度
一年多之前 回复

select g.*,sum(gs.number) number from goods g,goods_stock gs,warehouses w
where w.id='123456789' and gs.warehouse_id='123456789' and g.id=gsd.doods_id
group by g.id,g.***
(g.***是因为不知道你goods表会不会有一样的id记录,如果有的话需要在goods找一个可以区分的字段)

qq_37129624
ghq-yes 回复xujiannan1988: 那不需要区分同id商品的话,就直接去掉这个东西
一年多之前 回复
xujiannan1988
xujiannan1988 goods是商品表,商品表里面不会有仓库分区ID的,因为商品是会在很多分区里面存放的
一年多之前 回复

select g.id goods_id,sum(b.number) number
from goods g
left join (
select gs.goods_id,gs.number from goods_stock gs on g.id = gs.goods_id
join warehouses w on gs.warehouse_id = w.id

where w.id = '123456789'
) b on g.id=b.goods_id
group by g.id

可以这样,你商品表没有条件,如果商品也很多查询也快不了
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问