2 lnktoking lnkToKing 于 2016.09.12 10:24 提问

mysql 分组合计sql求优化

有两表T1,T2。

T1约9000条数据,有以下列:

id,eid,name

T2约50000条数据,有以下列:

id,eid,num



现要查出T1表中eid在T2表中同一个eid的num合计,其中求合计后的数据总数sql如下,耗时5秒,求优化:

SELECT COUNT(*) FROM(
SELECT T1.id,T1.eid,T1.name, t.num FROM T1
LEFT JOIN (SELECT eid, COUNT(*) AS num FROM T2 GROUP BY eid) t ON t.eid = T1.eid
WHERE t.num > 0
) t

5个回答

lpsky0865
lpsky0865   2016.09.12 11:11

必须这样写啊,弟弟

SELECT count(*) FROM T1
 INNER JOIN (SELECT eid, COUNT(*) AS num FROM T2 GROUP BY eid HAVING COUNT(*)>0) t ON t.eid = T1.eid 
lnkToKing
lnkToKing 回复颠颠颠: 不能用 INNER,用了 INNER 数变少了,对不上
大约一年之前 回复
lpsky0865
lpsky0865 回复lnkToKing: 应该有2000条没有和T2关联上。 你可以用自己的语句,去掉num>0条件进行核实
大约一年之前 回复
lpsky0865
lpsky0865 回复lnkToKing: T1和T2
大约一年之前 回复
lnkToKing
lnkToKing 试过用 INNER 了,查询在1秒内,但问题是应该是要查出9000多数据的,但只查出7000多
大约一年之前 回复
lnkToKing
lnkToKing num > 0 的0其实是个参数来的,不一定是0
大约一年之前 回复
lpsky0865
lpsky0865 HAVING COUNT(*)>0 可以去掉
大约一年之前 回复
zhaihonghonghzh
zhaihonghonghzh   2016.09.12 18:11

没有比较用嵌套查询啊 分组可以放到where后面

zhaihonghonghzh
zhaihonghonghzh   2016.09.12 18:16

SELECT COUNT(t.*) FROM t1 t LEFT JOIN t2 t2 ON t.eid = t2.eid WHERE t2.num >0 GROUP BY t2.eid
你用这条sql执行下试试

lnkToKing
lnkToKing   2016.09.13 11:37

SELECT COUNT(t.*) FROM t1 t LEFT JOIN t2 t2 ON t.eid = t2.eid WHERE t2.num >0 GROUP BY t2.eid
这样写效果更慢,要1分多钟

lnkToKing
lnkToKing   2016.11.25 11:15

最后查到有个查询字段是varchar(2000)太长,联表查询使用的是ALL类型,要返回全部结果,所以很慢。解决办法:二次查询,这个字段另外单独查

Csdn user default icon
上传中...
上传图片
插入图片