2011-11-14 37 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中工作比較慢」或者其他類似的問題,如果沒有人幫助你。 –