求解 spring中jdbcTemplate从mysql百万数据查询出50多万条数据很慢 spring数据库mysql查询慢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 二楼的方法就可以,建议你看看数据库索引。最主要的作用是可以大大加快 数据的检索速度。索引的作用: http://blog.csdn.net/pang040328/article/details/4164874mysql如何创建索引:http://blog.sina.com.cn/s/blog_7522019b01015fcm.html 这个可以有,查询条件加个索引,会快很多...楼主想分表查询? 将数据分开查?不是索引的问题,直接在数据库里面执行脚本也就2-3秒,关键是在java中最后生成list对象这部很慢看下面的代码嘛,while这部分很慢dbcTemplate.query(sql, new Object[]{platform}, new ResultSetExtractor<List<Device>>() { @Override public List<Device> extractData(ResultSet rs) throws SQLException, DataAccessException { rs.last(); int row = rs.getRow(); List<Device> devices = new ArrayList<Device>(row+10); rs.beforeFirst(); Device device;//while循环里面非常慢,前面执行都很快 while (rs.next()) { device = new Device(); device.setUdid(rs.getString("udid")); device.setCountry(rs.getString("country")); device.setLanguage(rs.getString("language")); device.setOsVersion(rs.getString("osVersion")); device.setPlatform(rs.getInt("platform")); device.setToken(rs.getString("token")); devices.add(device); } return devices; } new 对象的方式,肯定慢的 new一个对象不慢的,经测试new100W个Device对象非常快的,我觉得问题的瓶颈是ResultSet 遍历这里 业务需求,没办法,需要一次性加载到内存中一次性加载这么多数据到内存!!!!建议你使用文件缓存吧,第一次查询后,把结果集缓存进文件,下次直接读文件或者使用ehcache做缓存 问题就出现在,你查询出数据再装到java中这个过程中慢,你可以打印一下时间,即每次rs.next()的时间,会发现在把数据装到Java内存里面的时候花费 了大量的时间、以前做过读取好几G的表,基本要读取一晚上 业务需求,没办法,需要一次性加载到内存中一次性加载这么多数据到内存!!!!建议你使用文件缓存吧,第一次查询后,把结果集缓存进文件,下次直接读文件或者使用ehcache做缓存的确就是问题出现在rs.next():没办法了,重新换了数据库,没用mysql,改用mongodb了,百万级数据到内存中也就5-6s这个可以接受了,谢谢各位的回答 业务需求,没办法,需要一次性加载到内存中一次性加载这么多数据到内存!!!!建议你使用文件缓存吧,第一次查询后,把结果集缓存进文件,下次直接读文件或者使用ehcache做缓存缓存没多大用,数据库里面的数据更新比较频繁的 同一个过滤器,WEB.XML如何设置两个参数 Junit4进行重复测试 一个非常奇怪的问题,你回答了一定有成就感。 怎么利用AJAX实现对Table字段的填充 新手WEBSERVICE的4个问题,请教~ IIS6.0与resin3.0.21整合问题 想做一个J2EE的网站,谁提供个便宜好用的空间 请各位大虾请推荐几本书 jbuilder 有没有中文版 ssh配置看不懂,请指教 oracle表,字段名有“/”在做hibernate映射时怎么做? 计算java常用类型字节大小的工具类
索引的作用: http://blog.csdn.net/pang040328/article/details/4164874
mysql如何创建索引:http://blog.sina.com.cn/s/blog_7522019b01015fcm.html
楼主想分表查询? 将数据分开查?不是索引的问题,直接在数据库里面执行脚本也就2-3秒,关键是在java中最后生成list对象这部很慢看下面的代码嘛,while这部分很慢
dbcTemplate.query(sql, new Object[]{platform}, new ResultSetExtractor<List<Device>>() {
@Override
public List<Device> extractData(ResultSet rs) throws SQLException, DataAccessException {
rs.last();
int row = rs.getRow();
List<Device> devices = new ArrayList<Device>(row+10);
rs.beforeFirst();
Device device;
//while循环里面非常慢,前面执行都很快
while (rs.next()) {
device = new Device();
device.setUdid(rs.getString("udid"));
device.setCountry(rs.getString("country"));
device.setLanguage(rs.getString("language"));
device.setOsVersion(rs.getString("osVersion"));
device.setPlatform(rs.getInt("platform"));
device.setToken(rs.getString("token"));
devices.add(device);
}
return devices;
}
或者使用ehcache做缓存
以前做过读取好几G的表,基本要读取一晚上
或者使用ehcache做缓存的确就是问题出现在rs.next():没办法了,重新换了数据库,没用mysql,改用mongodb了,百万级数据到内存中也就5-6s这个可以接受了,谢谢各位的回答
或者使用ehcache做缓存
缓存没多大用,数据库里面的数据更新比较频繁的