1,不要使用*
2,替换相关子查询,将exists 换成inner join试试
3,不要进行无谓的排序, 将order by子句去掉
4,创建相应的索引,在status ,platf_id 和 rate 上创建索引
5,.....
大哥,第一点我改掉之后效率补不是很明显,我数据要用到的字段比较多,第二点用join之前尝试过不行,至于排序是客户的需求。第三点就是我目前的数据量才3百多条,建索引合适吗
@IT、小白:
总数300条,还有什么性能问题,逗我了?
你也可以在t_pf_borrow 创建索引
@悦光阴: 我现在在想,写成存储过程好一点,还是建索引好一点
单表 且 只有300的条数据, 我觉得效率慢只能是sql写的有问题;
1:EXISTS ()
2:HAVING 单独使用 不符合规范, mysql可以单独使用HAVING 是因为它会补全GROUP BY NULL
可是去掉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
试下这个:
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 ;