簡體   English   中英

MySQL查詢結果非常慢

[英]MySQL Query result is very slow

我正在一個小桌子上執行一個簡單的查詢

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中執行查詢則需要不到一秒鍾。

這里的問題很可能是

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

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

這個Listener通知意味着一些開銷。 可能,每次調用間接涉及調用invalidate GUI的狀態invalidate ,以及更多,因為該表必須在更改后重繪。 在15秒內完成1300x意味着每秒100次這樣的呼叫,這是非常合理的。 OP應該尋找一種方法來首先收集所有數據,然后僅使用所有數據更新表模型一次 這可能意味着必須實現自己的DefaultTableModelAbstractTableModel變體。

我會使用PreparedStatment ,我會增加默認的ResultSet fetchSize ,我會將查詢限制為三列( 注意 id != Number ) -

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

最后,建立這樣的連接可能是獲得性能的錯誤方法。 您應該尋找像BoneCPc3p0HikariCP這樣的連接池。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM