首页 新闻 搜索 专区 学院

mysql sql 优化 查询速度很慢

0
悬赏园豆:50 [待解决问题]
 select t.*,  (select count(id) from p2p_user   
    where   create_time >=t.agent_create_time  and  pid = t.id ) as  recommend_number,  
(select count(id) from p2p_user    
    where    create_time >=t.agent_create_time and  pid = t.id and  is_deal_load= 1 ) as recommend_load_number ,
(select sum(money) from   p2p_deal_load   
    where    create_time >=t.agent_create_time  and  pid=t.id ) as  deal_load_total  ,
(select  sum(income) from  p2p_agent_deal_load_detail 
    where user_id =t.id   ) as agent_income 
from p2p_user as t;

上面是sql语句,但是需要很久才能查询出结果,怎么去优化它,求助各路大神!

满满的记忆的主页 满满的记忆 | 初学一级 | 园豆:126
提问于:2016-06-20 15:14
< >
分享
所有回答(3)
0

你的子查询确实会很慢

改变的方法很简单,聚合函数是可以带参数的,这样就不需要子查询了

但是这样只能返回一条数据,你为啥需要select t.*我就有点搞不懂了,

还有一种很简单的就是使用join,不用子查询,这样你的查询数据就会降低很多,估计效率就上来了

select *
from p2p_user as t,(
select  (select count(id) from p2p_user   
    where   create_time >=t.agent_create_time  and  pid = t.id ) as  recommend_number,  
(select count(id) from p2p_user    
    where    create_time >=t.agent_create_time and  pid = t.id and  is_deal_load= 1 ) as recommend_load_number ,
(select sum(money) from   p2p_deal_load   
    where    create_time >=t.agent_create_time  and  pid=t.id ) as  deal_load_total  ,
(select  sum(income) from  p2p_agent_deal_load_detail 
    where user_id =t.id   ) as agent_income 
)

 

 

 

刘宏玺 | 园豆:14004 (专家六级) | 2016-06-20 15:34

多谢你的回答,后面我已经解决了,使用了 join 然后添加了索引

支持(0) 反对(0) 满满的记忆 | 园豆:126 (初学一级) | 2016-08-23 09:30
0

还有  不要 用 * 

用到哪些字段就写那些字段  会好一点尽量多用多表联查  别写子查询

R_Oasis | 园豆:71 (初学一级) | 2016-06-20 16:12
0

这个是累积求和的问题,使用join 会产生大量的中间结果集,并不一定会提高查询速度,尝试使用outer apply,应该会比子查询速度快点

悦光阴 | 园豆:2239 (老鸟四级) | 2016-08-20 23:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册