首页新闻找找看学习计划

mysql查询优化

0
悬赏园豆:50 [已解决问题] 解决于 2017-03-02 18:36
    select * from t_pf_borrow as d
where  status='1' and EXISTS (
select count(1) from  t_pf_borrow  
where platf_id=d.platf_id and rate > d.rate
having count(1)<3
)   order by  d.rate  desc 
IT、小白的主页 IT、小白 | 初学一级 | 园豆:114
提问于:2017-03-02 10:58
< >
分享
最佳答案
0

1,不要使用*

2,替换相关子查询,将exists 换成inner join试试

3,不要进行无谓的排序, 将order by子句去掉

4,创建相应的索引,在status ,platf_id 和 rate 上创建索引

5,.....

收获园豆:30
悦光阴 | 老鸟四级 |园豆:2239 | 2017-03-02 11:25

大哥,第一点我改掉之后效率补不是很明显,我数据要用到的字段比较多,第二点用join之前尝试过不行,至于排序是客户的需求。第三点就是我目前的数据量才3百多条,建索引合适吗

IT、小白 | 园豆:114 (初学一级) | 2017-03-02 12:17

@IT、小白: 

总数300条,还有什么性能问题,逗我了?

你也可以在t_pf_borrow 创建索引

悦光阴 | 园豆:2239 (老鸟四级) | 2017-03-02 15:01

@悦光阴: 我现在在想,写成存储过程好一点,还是建索引好一点

IT、小白 | 园豆:114 (初学一级) | 2017-03-02 15:04
其他回答(2)
0

单表  且 只有300的条数据, 我觉得效率慢只能是sql写的有问题;

1:EXISTS () 

2:HAVING 单独使用  不符合规范,  mysql可以单独使用HAVING 是因为它会补全GROUP BY NULL

收获园豆:20
、熙和 | 园豆:1486 (小虾三级) | 2017-03-02 15:13

可是去掉exists 和having 速度也是一样的

SELECT

    *

FROM

    t_pf_borrow pb

WHERE

    3 > (

        SELECT

            COUNT(1)

        FROM

            t_pf_borrow

        WHERE

            platf_id = pb.platf_id

        AND rate > pb.rate

    )

ORDER BY

    pb.rate DESC

支持(0) 反对(0) IT、小白 | 园豆:114 (初学一级) | 2017-03-02 15:27
0
试下这个:
select
d.platf_id,d.rate from t_pf_borrow as d left join t_pf_borrow as d2 on d2.platf_id=d.platf_id and d2.rate > d.rate where d.status='1' and d2.platf_id is not null group by d2.platf_id having count(0)<3 order by d.rate desc ;

 

Jimmy.pan | 园豆:242 (菜鸟二级) | 2017-03-02 17:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册