【问题标题】:MySQL Query result is very slowMySQL查询结果很慢
【发布时间】:2014-09-17 22:48:44
【问题描述】:

我正在一个小表上执行一个简单的查询

SELECT * FROM SYSTEM

系统表只有三列(Id、Name、Progress)和 1300 行。

我获取数据的代码是:

尝试 { Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = (连接) DriverManager.getConnection( "jdbc:mysql://192.168.0.107:3306/my_database", 用户名.getText(),密码.getText()); String query = "select * from system"; stmt = (语句) conn.createStatement(); rs = (ResultSet) stmt.executeQuery(query); 而(rs.next()){ tableModel.addRow(new Object[] { rs.getInt("Number"), rs.getString("姓名"), rs.getFloat("进度") }); } } 捕捉(异常 e){ // 一些其他代码 }`

这段代码在我的 JTable 中显示日期大约需要 15 秒,而如果我在 phpmyadmin 中执行查询,则只需不到一秒。

【问题讨论】:

  • 分析代码或添加计时语句以查看时间花费在哪里。我认为一个名为 SYSTEM 的表是个坏主意。
  • 是executeQuery还是处理ResultSet的时间慢?
  • 先获取executeQuery语句开始的实际时间,之后确定执行查询的实际时间。
  • 我刚刚检查过了。查询的执行很好(~1s),结果集的处理很慢。除了使用线程,我应该怎么做才能让while循环更快地完成?
  • @user3822347 阅读我的答案。最重要的部分可能是最后两句话。

标签: java mysql sql jdbc


【解决方案1】:

这里的问题可能是

while (rs.next()) { tableModel.addRow(...)

每次调用addRow() 意味着“将生成正在添加的行的通知。”

Listener(s) 的通知意味着相当多的开销。很可能,每个调用都间接涉及对invalidate GUI 状态的调用,等等,因为表在更改后必须重新绘制。在约 15 秒内完成 1300 倍意味着每秒 100 次调用,这是相当合理的。 OP 可能应该寻找一种方法来首先收集所有数据,然后只用所有数据更新表模型一次。这可能意味着必须实现他自己的DefaultTableModelAbstractTableModel 变体。

【讨论】:

    【解决方案2】:

    我将使用PreparedStatment,并增加默认ResultSet fetchSize,并将查询限制为三列(注意 id != Number)-

    String query = "select Number, Name, Progress from system";
    stmt = conn.prepareStatement(query);
    rs = stmt.executeQuery();
    rs.setFetchSize(250);
    

    最后,建立这样的连接可能是提高性能的错误方法。您应该寻找像BoneCPc3p0HikariCP 这样的连接池。

    【讨论】:

    • 我还要补充一点,设置 fetchSize 是对配置的 JVM 堆大小的权衡。如果需要定期更改 fetchSize,可能需要考虑使两者保持一致。
    • @Rai 对于三个小列,我什至可以将其设置为 1000。超过 50 左右,它通常只是微不足道的快。
    • MySQL JDBC 总是获取所有行,除非获取大小设置为 Integer.MIN_VALUE,请参阅 ResultSet 下的 Connector J implementation notes。增加 MySQL 的 fetch size 是没有用的。
    • 另外,我建议您将 MySQL JDBC 配置调整为 recommended here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2014-08-02
    相关资源
    最近更新 更多