2011-11-14 36 views
1

我有一个或多或少好的工作查询(关于结果),但它需要大约45秒的时间来处理。对于在GUI中显示数据来说,这肯定太长了。
所以我的要求是找到一个更快/有效的查询(大约几毫秒的东西会很好) 我的数据表有一些东西在〜2,619,395条目,并且仍在增长。mysql查询 - 优化现有的最大 - 最小查询的一个巨大的表

模式:

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 

我就可以了想法:

  1. 写几个用诸如'在2008-01-01和2008-01-02之间“获取MIN(exportValue)以及在2008-12-30和2008-12-31之间获取MAX(exportValue) - 问题:许多查询和在指定的时间范围内没有数据的问题(不保证会有数据)
  2. 仅限使用MIN(fetchDate)命令将结果集限制到我的10个工作站 - 问题:也需要很长时间来处理查询

附加信息:
我用在Java应用程序中查询。这意味着,如果需要,可以对结果集进行一些后处理。 (JPA 2.0)

任何帮助/方法/想法都非常赞赏。提前致谢。

回答

1

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

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

感谢这个创建索引的好提示。我用谷歌来找到更多的信息 - > http://www.sitepoint.com/optimizing-mysql-application(如果有人对它感兴趣)。我的查询现在处理约5秒钟。不幸的是,只有当使用phpMyAdmin的sql控制台,而不是使用JPA 2.0处理来自Java的查询时:/(但我会看一下) – RonH

0

此查询的3000条记录运行应该是非常快的。

建议:

  • 你有PK在这个表中设置?站,fetchDate?
  • 添加索引;你应该尝试并尝试使用索引。okelly在他的回答中建议
  • 取决于索引的实验,尝试将查询分解为多个语句 - 在一个存储过程中;这样你就不会在从客户端发送到mysql的多个查询之间的网络流量中浪费时间
  • 你提到你尝试了单独的查询,并且在没有特定月份的数据时出现问题;它是业务应用程序中的常规情况,您应该在“主查询”(存储过程或应用程序代码)中处理它
  • guess fetchDate是插入记录时的当前日期和时间;考虑将以前的月份数据保存为汇总表,其中包含年份,月份,工作站,最大值(exportValue),最小值(exportValue) - 这意味着您应该在每个月末的汇总表中插入汇总记录;删除,保留或移动详细记录到单独的表格是您的选择

由于您的表正在快速增长(每15分钟)您应该考虑最后一条建议。可能没有必要在一个地方保留详细的历史记录。归档数据是应该作为维护的一部分来完成的过程。

+0

感谢您的建议。我写了一个错误的值的数量的条目..它是千倍以上的3k ..:/(数据从2008年到现在每15分钟每天从日出到日落[来自一些光伏电台的数据库内容数据])。我忘了提及,数据库属于客户端。所以我不能真正修改它添加新的字段等,但我测试了我的本地转储索引的东西。查询在phpMyAdmin的sql浏览器中编写的查询处理得更快,但是在我使用JPA 2.0的JavaApplication中没有:( – RonH

+0

不客气,不幸的是我没有帮助。我非常抱歉,但我不熟悉JPA,猜测JPA是在你写的时候不执行你的查询。也许你应该打开另一个问题,比如“查询在JPA中工作比较慢”或者其他类似的问题,如果没有人帮助你。 –