java优化从数据库中读取

6g8kf2rb  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(414)

我需要签入数据库存在~2k记录,我测试数据库大小1.000.000的id,需要46秒。太长了,因为将来这个数据库可能会有超过500000条记录。有什么方法可以加快db的搜索速度吗?我在java中使用jdbc,代码如下:

public int search(List<String> toSearch) throws SQLException {
    String query = "SELECT * FROM strings where string =  ?";
    StringBuilder sB = new StringBuilder(query);
    for (int i=0; i<toSearch.size()-1; i++) {
        sB.append("OR string=?");
    }
    System.out.println(toSearch.size());

    PreparedStatement prep = con.prepareStatement(sB.toString());

    int i=1;
    for (String string : toSearch) {
        prep.setString(i, string);
        i++;
    }
    long data = System.currentTimeMillis();
    ResultSet resultSet = prep.executeQuery();
    long data2 = System.currentTimeMillis();
    System.out.println((data2 - data) / 1000);
    List<String> toReturn = new ArrayList<>();
    while (resultSet.next()) {

        toReturn.add(resultSet.getString("string"));

    }
    return toReturn.size();

}

表名是字符串,列字符串。

klsxnrf1

klsxnrf11#

首先,你需要有一个索引 string 列。

CREATE INDEX indexName ON strings(string);

不要为h2构造参数数目可变的查询。使用

PreparedStatement ps = con.prepareStatement("SELECT * FROM strings WHERE string = ANY(?)");
ps.setObject(1, toSearch.toArray(new String[0]));

如果您使用一些旧的不受支持的h2版本,请使用它的 TABLE() 改为按照随您的版本分发的文档中所述的方式运行( Prepared Statements and IN(...) pdf格式)。
对于其他dbms,您可能需要其他技巧来避免动态生成sql代码, = ANY(?) 将在postgresql及其forks和h2中工作,但在其他dbms中不工作。

相关问题