mysql查询-针对大型表优化现有的MAX-MIN查询
我有一个大致不错的工作查询(关于结果),但处理大约需要45秒。在GUI中显示数据肯定太长了。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 |
因此,我的要求是找到一个更快/更高效的查询(大约几毫秒的时间就可以了) 我的数据表大约有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
我的想法是:
我正在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