使用Jpa遇到查询特别慢的情况(limit和order by坑)

项目中数据量过八百万遇到查询慢的问题

问题

项目后期进行压力测试,当mysql表数据过8百万时,进行查询需要20多秒,在navicat中用sql执行了一遍发现应该1秒左右。

解决

因为项目前期使用的是JPA,将JPA转成JdbcTemplate来查询数据。但是结果发现访问时间还是20多秒。反复测了几次发现,原来我之前测试1秒,是由于order by和limit没有一起使用,前面都是单独测的。最后我将整个查询语句封装了一个子查询,将order by 放在子查询里。将limit发在外部,这个问题就解决了。网上查阅资料应该是limit 中也使用了order,导致了全表扫描。

select * from table where 1=1... order by date limit 0,50; 20秒
select * from (select * from table where 1=1... order by date)a limit 0,50; 1秒

jpa还是有很多问题的,虽然提供了越来越多的优化,但是项目深入发展下去很容易造成性能瓶颈,后面的改造会比较麻烦。mysql确实是吃程序员水平的数据库,JPA前期写着很开心,后面改起来比较麻烦,无法处理复杂sql

你可能感兴趣的:(使用Jpa遇到查询特别慢的情况(limit和order by坑))