优化从数据库读取
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 中使用,但不能在其他中使用数据库管理系统。
我需要检查数据库是否存在 ~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 中使用,但不能在其他中使用数据库管理系统。