当前位置: 代码迷 >> J2EE >> 求解 spring中jdbcTemplate从mysql百万数据查询出50多万条数据很慢,该如何解决
  详细解决方案

求解 spring中jdbcTemplate从mysql百万数据查询出50多万条数据很慢,该如何解决

热度:74   发布时间:2016-04-17 23:45:49.0
求解 spring中jdbcTemplate从mysql百万数据查询出50多万条数据很慢
开始使用mybatis查询很慢,换成jdbcTemplate还是很慢
数据库里面大概有100W条数据,select udid,token,country,language,platform,osVersion from device_info where platform=?这段查询出来大概有50W数据,在程序中查询很慢,数据中查询也就2s左右,求解?可以用分表来解决吗?

public List<Device> findByPlatform(int platform) {
String key = "platform-device-"+platform;
List<Device> devices = (List<Device>) RedisClient.getObject(key);
if(devices == null){
String sql = "select udid,token,country,language,platform,osVersion from device_info where platform=?";
devices = (List<Device>) jdbcTemplate.query(sql, new Object[]{platform}, new DeviceMapper());
                        //这句执行很慢,数据库里面总共100W数据,查询出来大概有50W条数据,数据库执行时间大概2-3s,
                        //求解为什么在程序里面执行这么慢?
}
return devices;

}

------解决方案--------------------
platform 做个索引
------解决方案--------------------
引用:
platform 做个索引


这个可以有,查询条件加个索引,会快很多...


楼主想分表查询? 将数据分开查?
------解决方案--------------------
二楼的方法就可以,建议你看看数据库索引。最主要的作用是可以大大加快 数据的检索速度。
索引的作用:               http://blog.csdn.net/pang040328/article/details/4164874
mysql如何创建索引:http://blog.sina.com.cn/s/blog_7522019b01015fcm.html
------解决方案--------------------
为什么要一次查询出这么多的数据呢,这样多占内存,先查出一页再分页展示不行吗?数据库中查询也只是展示了第一页吧。
------解决方案--------------------
引用:
Quote: 引用:

为什么要一次查询出这么多的数据呢,这样多占内存,先查出一页再分页展示不行吗?数据库中查询也只是展示了第一页吧。

业务需求,没办法,需要一次性加载到内存中


一次性加载这么多数据到内存!!!!建议你使用文件缓存吧,第一次查询后,把结果集缓存进文件,下次直接读文件
或者使用ehcache做缓存
------解决方案--------------------
问题就出现在,你查询出数据再装到java中这个过程中慢,你可以打印一下时间,即每次rs.next()的时间,会发现在把数据装到Java内存里面的时候花费 了大量的时间、
以前做过读取好几G的表,基本要读取一晚上
  相关解决方案