我的mysql查询有问题需要花费太长时间才能执行。
private void sqlExecute(String sql, Map<Integer, Object> params) {
try (Connection conn = dataSource.getConnection(); PreparedStatement statement = conn.prepareStatement(sql)) {
if (params.size() > 0) {
for (Integer key : params.keySet()) {
statement.setObject(key, params.get(key));
}
}
statement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
我已将问题明确缩小到executeUpdate()
行。其他所有东西都运行得很顺利,但是这条特殊的行(以及当我运行executeQuery()
时)需要大约70毫秒来执行。这似乎不是一段不合理的时间,但目前这是一个小于100行的测试数据库表。列已建立索引,因此典型查询仅查看大约15行。
但最终,我们需要扫描数千行的更大的表。此外,我们一次运行多个查询(它们实际上无法进行批处理,因为每个查询的结果都用于将来的查询),因此所有这些查询都更像7s。
以下是运行mysql查询的方法示例:
public void addRating(String db, int user_id, int item_id) {
parameters = new HashMap<>();
parameters.put(1, user_id);
parameters.put(2, item_id);
sql = "INSERT IGNORE INTO " + db + " (user_id, item_id) VALUES (?, ?)";
sqlExecute(sql, parameters);
}
有几点需要注意:
dataSource.getConnection()
也需要大约70毫秒。我在本地运行此代码。INSERT
的{{1}},但使用executeUpdate()
的{{1}}语句也会遇到同样的问题。