解决方案 »

  1.   

    二楼的方法就可以,建议你看看数据库索引。最主要的作用是可以大大加快 数据的检索速度。
    索引的作用:               http://blog.csdn.net/pang040328/article/details/4164874
    mysql如何创建索引:http://blog.sina.com.cn/s/blog_7522019b01015fcm.html
      

  2.   

    这个可以有,查询条件加个索引,会快很多...
    楼主想分表查询? 将数据分开查?不是索引的问题,直接在数据库里面执行脚本也就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;
    }
      

  3.   

    new 对象的方式,肯定慢的
      

  4.   

    new一个对象不慢的,经测试new100W个Device对象非常快的,我觉得问题的瓶颈是ResultSet 遍历这里
      

  5.   

    业务需求,没办法,需要一次性加载到内存中一次性加载这么多数据到内存!!!!建议你使用文件缓存吧,第一次查询后,把结果集缓存进文件,下次直接读文件
    或者使用ehcache做缓存
      

  6.   

    问题就出现在,你查询出数据再装到java中这个过程中慢,你可以打印一下时间,即每次rs.next()的时间,会发现在把数据装到Java内存里面的时候花费 了大量的时间、
    以前做过读取好几G的表,基本要读取一晚上
      

  7.   

    业务需求,没办法,需要一次性加载到内存中一次性加载这么多数据到内存!!!!建议你使用文件缓存吧,第一次查询后,把结果集缓存进文件,下次直接读文件
    或者使用ehcache做缓存的确就是问题出现在rs.next():没办法了,重新换了数据库,没用mysql,改用mongodb了,百万级数据到内存中也就5-6s这个可以接受了,谢谢各位的回答
      

  8.   

    业务需求,没办法,需要一次性加载到内存中一次性加载这么多数据到内存!!!!建议你使用文件缓存吧,第一次查询后,把结果集缓存进文件,下次直接读文件
    或者使用ehcache做缓存
    缓存没多大用,数据库里面的数据更新比较频繁的