mysql查询-针对大型表优化现有的MAX-MIN查询

mysql查询-针对大型表优化现有的MAX-MIN查询,mysql,sql,jpa-2.0,Mysql,Sql,Jpa 2.0,我有一个大致不错的工作查询(关于结果),但处理大约需要45秒。在GUI中显示数据肯定太长了。 因此,我的要求是找到一个更快/更高效的查询(大约几毫秒的时间就可以了) 我的数据表大约有3000~2619395个条目,并且还在增长 模式: num | station | fetchDate | exportValue | error 1 | PS1 | 2010-10-01 07:05:17 | 300 | 0 2 | PS2 |

我有一个大致不错的工作查询(关于结果),但处理大约需要45秒。在GUI中显示数据肯定太长了。
因此,我的要求是找到一个更快/更高效的查询(大约几毫秒的时间就可以了) 我的数据表大约有3000~2619395个条目,并且还在增长

模式:

num | station | fetchDate             | exportValue | error
1   | PS1     | 2010-10-01 07:05:17   | 300         | 0
2   | PS2     | 2010-10-01 07:05:19   | 297         | 0
923 | PS1     | 2011-11-13 14:45:47   | 82771       | 0
解释

  • exportValue总是递增的
  • exportValue表示实际的绝对值
  • 就我而言,有10个车站
  • 每15分钟,将有10个新条目写入表中
  • 错误只是正确工作站的指示器
工作查询:

select
    YEAR(fetchDate), station, Max(exportValue)-MIN(exportValue)
from
    registros
where
    exportValue > 0 and error = 0 
group
    by station, YEAR(fetchDate)
order 
    by YEAR(fetchDate), station
输出:

Year | station | Max-Min
2008 | PS1     | 24012
2008 | PS2     | 23709
2009 | PS1     | 28102
2009 | PS2     | 25098
我的想法是:

  • 使用诸如“介于2008-01-01和2008-01-02之间”之类的语句编写多个查询以获取最小值(exportValue),以及在2008-12-30和2008-12-31之间编写多个查询以获取最大值(exportValue)-问题:大量查询以及在指定时间范围内没有数据的问题(不保证会有数据)
  • 使用order by MIN(fetchDate)将结果集限制在我的10个站点-问题:处理查询也需要很长时间
  • 其他信息:
    我正在JAVA应用程序中使用查询。这意味着,如果需要,可以对结果集进行一些后处理。(JPA2.0)


    非常感谢您的任何帮助/方法/想法。提前感谢。

    添加合适的索引将有所帮助。 2个复合索引将显著加快速度:

    ALTER TABLE tbl_name ADD INDEX (error, exportValue);
    ALTER TABLE tbl_name ADD INDEX (station, fetchDate);
    

    添加合适的索引将有所帮助。 2个复合索引将显著加快速度:

    ALTER TABLE tbl_name ADD INDEX (error, exportValue);
    ALTER TABLE tbl_name ADD INDEX (station, fetchDate);
    

    这个查询在3000条记录上运行应该非常快

    建议:

    • 这张桌子上有PK吗?车站,日期
    • 增加索引;你应该像rich.okelly在回答中所建议的那样尝试索引
    • 根据索引实验,尝试将查询分解为多个语句-在一个存储过程中;这样,您就不会在从客户端发送到mysql的多个查询之间的网络通信中浪费时间
    • 您提到您尝试了单独的查询,当没有特定月份的数据时出现问题;这是业务应用程序中的常见情况,您应该在“主查询”(存储过程或应用程序代码)中处理它
    • guess fetchDate是插入记录时的当前日期和时间;考虑将前几个月的数据保存在汇总表中,包括字段:年、月、站、max(ExpValueValm)、Min(ExpValueValue-),这意味着您应该在每个月底插入汇总表中的摘要记录;您可以选择删除、保留或移动明细记录到单独的表中

    由于您的桌子正在快速增长(每15分钟一次),您应该考虑最后一个建议。也许,没有必要在一个地方保存详细的历史。归档数据是一个应该作为维护的一部分来完成的过程。

    这个查询在3000条记录上运行应该非常快

    建议:

    • 这张桌子上有PK吗?车站,日期
    • 增加索引;你应该像rich.okelly在回答中所建议的那样尝试索引
    • 根据索引实验,尝试将查询分解为多个语句-在一个存储过程中;这样,您就不会在从客户端发送到mysql的多个查询之间的网络通信中浪费时间
    • 您提到您尝试了单独的查询,当没有特定月份的数据时出现问题;这是业务应用程序中的常见情况,您应该在“主查询”(存储过程或应用程序代码)中处理它
    • guess fetchDate是插入记录时的当前日期和时间;考虑将前几个月的数据保存在汇总表中,包括字段:年、月、站、max(ExpValueValm)、Min(ExpValueValue-),这意味着您应该在每个月底插入汇总表中的摘要记录;您可以选择删除、保留或移动明细记录到单独的表中

    由于您的桌子正在快速增长(每15分钟一次),您应该考虑最后一个建议。也许,没有必要在一个地方保存详细的历史。存档数据是一个过程,应该作为维护的一部分来完成。

    感谢您的建议。我为条目数量写了一个错误的值。。它是3k的千倍(从2008年到现在,每天从日出到日落每15分钟增加一次数据[一些光伏电站的数据库内容数据])。我忘了提到,数据库属于客户机。所以我不能通过添加新字段等来修改它,但我在本地转储上测试了索引。在phpMyAdmin的sql浏览器中编写的查询处理速度更快,但在我使用JPA 2.0的Java应用程序中没有:(不客气,不幸的是我没有提供帮助。我很抱歉,但我不熟悉JPA,我猜JPA没有像您编写的那样执行您的查询。也许您应该打开另一个问题,如“查询在JPA中工作得更慢”或者类似的问题,如果没有人帮你。谢谢你的建议。我写了一个错误的条目数量值。它是3k的千倍以上。:/(2008年至今的数据从日出到日落每15分钟增加一次[一些光伏电站的数据库内容数据])。我忘了提到,数据库属于客户端。因此,我无法通过添加新字段等方式对其进行修改。但我在本地转储上测试了索引内容。在phpMyAdmin的sql浏览器中编写的查询处理速度更快,但在使用JPA 2.0的Java应用程序中:(不客气,不幸的是我没有帮忙。我真的很抱歉,但我对JPA不熟悉,我猜JPA不是执行yo