优化从数据库读取

Optimization reading from database

我需要检查数据库是否存在 ~2k 条记录,我在 db 大小 1.000.000 上测试 id,它需要 46 秒。它太长了,因为将来这个数据库可以有超过 500.000.000 条记录。有什么办法可以加快从 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();

}

Table name is strings, column string.

首先,您需要在 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() 功能,而不是按照随您的版本分发的文档(PDF 中的 Prepared Statements and IN(...) 部分)中的描述。

对于其他 DBMS,您可能需要其他技巧来避免动态生成 SQL 代码,= ANY(?) 可以在 PostgreSQL 及其分支和 H2 中使用,但不能在其他中使用数据库管理系统。