当前位置: 首页 > 知识库问答 >
问题:

MySQL查询结果非常慢

苗森
2023-03-14

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

SELECT * FROM SYSTEM

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

我获取数据的代码是:

    try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = (Connection) DriverManager.getConnection(
                    "jdbc:mysql://192.168.0.107:3306/my_database",
                    username.getText(), password.getText());
            String query = "select * from system";
            stmt = (Statement) conn.createStatement();
            rs = (ResultSet) stmt.executeQuery(query);
            while (rs.next()) {
                tableModel.addRow(new Object[] { rs.getInt("Number"),
                        rs.getString("Name"), rs.getFloat("Progress") });
            }
        } catch (Exception e) {
            // some other code
        }`

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

共有2个答案

袁开宇
2023-03-14

这里的问题可能是

while(rs.next()){tablemodel.addrow(...)

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

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

陆敏学
2023-03-14

我将使用PreparedStatment并增加默认的ResultSetfetchSize,并且将查询限制为三列(注意ID!=Number)-

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

最后,建立这样的连接对于性能来说可能是错误的。您应该寻找一个连接池,如BoneCP或c3p0或hikaricp。

 类似资料:
  • 我在项目中使用Spring数据JPA。当我要求一份特定导演制作的电影列表时,我得到: 电影拍摄地点: 董事报告人: 人员存储库: 电影控制器: 我不明白为什么当sql查询一切正常工作时,但是当使用表达式搜索存储库时,它却不能正常工作。在阅读了类似的问题后,我没有找到任何解决我问题的东西。 董事实体: 个人实体: 电影实体:

  • 主要内容:单字段排序,多字段排序通过条件查询语句可以查询到符合用户需求的数据,但是查询到的数据一般都是按照数据最初被添加到表中的顺序来显示。为了使查询结果的顺序满足用户的要求,MySQL 提供了 ORDER BY 关键字来对查询结果进行排序。 在实际应用中经常需要对查询结果进行排序,比如,在网上购物时,可以将商品按照价格进行排序;在医院的挂号系统中,可以按照挂号的先后顺序进行排序等。 ORDER BY 关键字主要用来将查询结果中

  • 问题内容: 为什么简单地更新此表以添加列需要一个多小时?该表有1500万行。它具有2个索引和一个键主键。ALTER TABLE查询现在已处于“复制到tmp表”状态1小时15分钟。 表: 问题答案: 对于非常大的表,MySQL的ALTER TABLE性能可能会成为问题。MySQL通过创建一个具有所需新结构的空表,将旧表中的所有数据插入新表中,然后删除旧表来执行大多数更改。这可能会花费很长的时间,特别

  • 问题内容: 我已经开发了一个用户批量上传模块。有两种情况,当数据库有零条记录时,我批量上传了20000条记录。大约需要5个小时。但是,当数据库已经有大约30 000条记录时,上传速度将非常缓慢。上载2万条记录大约需要11个小时。我只是通过fgetcsv方法读取CSV文件。 下面是运行的查询。(我正在使用Yii框架) 如果存在,请更新用户: 如果用户不存在,请插入新记录。 表引擎类型为MYISAM。

  • 问题内容: 我有以下从数据库获取十六进制代码的函数 我的问题是我在回调函数中返回了结果,但getColour函数未返回任何内容。我希望getColour函数返回的值。 在我调用getColour的那一刻,它不返回任何内容 我尝试做类似的事情 但当然SELECT查询在返回值时已经完成 问题答案: 您只需要对回调中的db查询结果进行处理。就像。