java - 优化帮助 : SQL Query to display minimum prices per country

标签 java mysql sql swing query-optimization

我为我的一个客户开发了一种类似代码的招标管理系统。这是一段代码:

try {
    Connection con = Mycon.getConnection();
    PreparedStatement ps = con.prepareStatement("TRUNCATE tempcalcplan");
    ps.executeUpdate();
    ps.clearBatch();
    ps = con.prepareStatement("INSERT INTO tempcalcplan SELECT v.conid,c.conname, v.rate, v.venid FROM venprices v LEFT JOIN  country c ON c.conid = v.conid WHERE (v.conid, v.rate) IN ( SELECT v.conid, MIN(v.rate) FROM venprices v GROUP BY v.conid) GROUP BY v.conid");
    ps.executeUpdate();
    ps.clearBatch();
    ps = con.prepareStatement("select * from tempcalcplan");

    ResultSet rs = ps.executeQuery();
    jTable1.setModel(DbUtils.resultSetToTableModel(rs));
} catch(Exception e){
    e.printStackTrace();
}

这段代码被设计为:

  1. 清空表 tempcalcplan(假设存储了以前的结果。)
  2. 借助 2 个不同的表(表如下所示)生成所需的数据并将其存储在 tempcalcplan 表中
  3. 在 jTable 上显示 tempcalcplan 表的结果。

这是countrytempcalcplan 表。

  1. 国家(包含 30,000 条记录)

    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | conid   | int(10)     | NO   | PRI | NULL    |       |
    | conname | varchar(50) | YES  |     | NULL    |       |
    +---------+-------------+------+-----+---------+-------+
    
  2. tempcalcplan(包含 1,80,000 多条记录)

    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | conid   | int(10)     | NO   | PRI | NULL    |       |
    | conname | varchar(50) | YES  |     | NULL    |       |
    | rate    | double      | YES  |     | NULL    |       |
    | venid   | varchar(50) | YES  |     | NULL    |       |
    +---------+-------------+------+-----+---------+-------+
    
  3. venprices

    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | conid | int(10)      | NO   | PRI | NULL    |       |
    | rate  | double       | YES  |     | NULL    |       |
    | venid | varchar(50)  | NO   | PRI |         |       |
    +-------+--------------+------+-----+---------+-------+
    

结果最多需要 12-15 分钟才能显示在 jTable 中。 我想将它减少到 1-2 分钟。

最佳答案

这是可能花费最多时间的查询:

INSERT INTO tempcalcplan
    SELECT v.conid, c.conname, v.rate, v.venid
    FROM venprices v LEFT JOIN
         country c
         ON c.conid = v.conid
    WHERE (v.conid, v.rate) IN ( SELECT v.conid, MIN(v.rate) FROM venprices v GROUP BY v.conid) GROUP BY v.conid");

我的猜测是 WHERE 子句导致了问题。尝试将其移至 FROM 子句:

    SELECT v.conid, c.conname, v.rate, v.venid
    FROM venprices v LEFT JOIN
         country c
         ON c.conid = v.conid JOIN
         (SELECT v.conid, MIN(v.rate) as rate
          FROM venprices v
          GROUP BY v.conid
         ) vr
         ON v.conid = vr.conid and v.rate = vr.rate;

我认为您的索引已针对此查询设置得很好。

关于java - 优化帮助 : SQL Query to display minimum prices per country,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39659729/

相关文章:

java - 推荐的 Java/AJAX 设计模式?

mysql - 数据库输入副本

SQL Server - 从同一表中的数据更新列

mysql - 如何从 .sh 脚本中截断表?

java - 移动数组中的数字

java - 如何对Flux进行移动窗口计算并将结果作为新的Flux输出

java - 在web项目中以开发模式运行

mysql - 如何解决mysql中的时间数据类型

mysql - 已按值过滤的数据库子集中的随机行选择

sql - 如何在 Django ORM 中从多个表中进行 SELECT?