Java MySQL查询执行时间

时间:2017-04-10 16:10:37

标签: java mysql connection-pooling

我的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);
}

有几点需要注意:

  1. 列索引可能不是问题。在phpMyAdmin控制台中运行相同的mysql语句时,执行时间更像是0.3ms。
  2. 另外值得注意的是,无论实际的mysql语句如何,执行时间始终为70毫秒。
  3. 我正在使用连接池,并想知道这是否可能是问题的根源。在其他测试中,dataSource.getConnection()也需要大约70毫秒。我在本地运行此代码。
  4. 以上示例适用于使用INSERT的{​​{1}},但使用executeUpdate()的{​​{1}}语句也会遇到同样的问题。
  5. 我已尝试在每个Oracle的suggestion中使用/ dev / urandom,但这没有任何区别。

0 个答案:

没有答案