簡體   English   中英

mysql查詢-優化現有的MAX-MIN查詢以獲取巨大的表格

[英]mysql query - optimizing existing MAX-MIN query for a huge table

我有一個或多或少良好的工作查詢(關於結果),但大約需要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

我對此的看法:

  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)

任何幫助/方法/想法都非常感謝。 提前致謝。

添加合適的索引會有所幫助。 2個復合索引將顯着加快處理速度:

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

在3000條記錄上運行的此查詢應該非常快。

意見建議:

  • 你在這張桌子上放了PK嗎? 車站,fetchDate?
  • 添加索引; 您應該嘗試並嘗試使用他的答案中建議的rich.okelly索引
  • 根據索引的實驗,嘗試在一個存儲過程中將查詢分解為多個語句; 這樣,您將不會浪費時間從客戶端發送到mysql的多個查詢之間的網絡流量
  • 您提到您嘗試使用單獨的查詢,但是當特定月份沒有數據時會出現問題。 這在業務應用程序中很常見,您應該在“主查詢”(存儲過程或應用程序代碼)中進行處理
  • 猜測fetchDate是記錄插入時的當前日期和時間; 考慮將前幾個月的數據保留在具有以下字段的摘要表中:年,月,站,max(exportValue),min(exportValue)-這意味着您應該在每個月末在摘要表中插入摘要記錄; 選擇將詳細記錄刪除,保留或移動到單獨的表

由於您的桌子正在快速增長(每隔15分鍾),因此您應該考慮最后一個建議。 可能不需要將詳細的歷史記錄保存在一個地方。 歸檔數據是應在維護過程中完成的過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM