2013-10-08 23 views
1

我繼承了一個跟蹤與時間有關的溫度數據的系統。我曾問過一個關於它的問題:(What is the most efficient way to store a collection of temperature values into MYSQL?使用帶預處理日期條件的表可以提高效率嗎?

系統有一個單獨的表格用於跟蹤日期(如下所示)。它包含當天的幾個描述符列。我對這種結構所提供的好處猶豫不決,因爲它似乎增加了額外的權重來完成幾個日期函數和數學所能做的相同的事情。

系統的創建者告訴我,通過使用帶有運算符的DATE_ID而不是日期函數來選擇一系列數據會更好。

例如:假設您想從2012年6月1日到2012年底收集所有溫度信息,您可以執行以下操作。

1)獲取對應於6月1日的日期編號,2012年可以說的ID是23000

2)使用類似獲取對應於年底的日期ID:

SELECT DATE_ID FROM DATE_REPRESENTATION WHERE DATE_ID >= 23000 AND END_YEAR_FLAG = 1 AND LIMIT 1; 

比方說,那一次是23213

3)現在,我們將有2個DATE_IDs,我們可以只使用像這樣:

SELECT * FROM temperature_readings WHERE DATE_ID BETWEEN 23000 AND 23213; 


我覺得最好能正確索引'temperature_readings'表並使用日期函數。例如:

SELECT ...... actual_date BETWEEN DATE('2012-06-01') AND LAST_DAY(DATE_ADD(DATE('2012-06-01'), INTERVAL (12 - MONTH(DATE('2012-06-01'))) MONTH)) 


難道還有比什麼是目前使用在提高整體性能而言更好的解決方案?在前一個問題中,我提到系統使用數據根據日期範圍(每天,每週,每月,每年或用戶可指定的範圍)選擇的數據生成圖表和警報。

當前表:

CREATE TABLE `DATE_REPRESENTATION` (
    `DATE_ID` int(10) NOT NULL, 
    `DAY_DATE` timestamp NULL DEFAULT NULL, 
    `DATE_DESC_LONG` varchar(18) DEFAULT NULL, 
    `MB_DATE_M_D_YYYY` varchar(18) DEFAULT NULL, 
    `WEEKDAY` varchar(9) DEFAULT NULL, 
    `WEEKDAY_ABBREV` char(4) DEFAULT NULL, 
    `WEEKDAY_NUM` decimal(1,0) DEFAULT NULL, 
    `WEEK` char(13) DEFAULT NULL, 
    `WEEK_NUM` decimal(4,0) DEFAULT NULL, 
    `WEEK_NUM_ABS` decimal(4,0) DEFAULT NULL, 
    `MONTH_LONG` varchar(9) DEFAULT NULL, 
    `MONTH_ABBREV` char(3) DEFAULT NULL, 
    `MONTH_NUM` decimal(2,0) DEFAULT NULL, 
    `MONTH_NUM_ABS` decimal(5,0) DEFAULT NULL, 
    `QUARTER` char(1) DEFAULT NULL, 
    `QUARTER_NUM` decimal(1,0) DEFAULT NULL, 
    `QUARTER_NUM_ABS` decimal(5,0) DEFAULT NULL, 
    `YEAR4` decimal(4,0) DEFAULT NULL, 
    `BEG_WEEK_FLAG` decimal(1,0) DEFAULT NULL, 
    `END_WEEK_FLAG` decimal(1,0) DEFAULT NULL, 
    `BEG_MONTH_FLAG` decimal(1,0) DEFAULT NULL, 
    `END_MONTH_FLAG` decimal(1,0) DEFAULT NULL, 
    `BEG_QUARTER_FLAG` decimal(1,0) DEFAULT NULL, 
    `END_QUARTER_FLAG` decimal(1,0) DEFAULT NULL, 
    `BEG_YEAR_FLAG` decimal(1,0) DEFAULT NULL, 
    `END_YEAR_FLAG` decimal(1,0) DEFAULT NULL, 
    PRIMARY KEY (`DATE_ID`), 
    UNIQUE KEY `DATEID_PK` (`DATE_ID`), 
    KEY `timeStampky` (`DAY_DATE`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

回答

1

一個日期應該在內部存儲爲只是一個數字,所以我能想象的唯一事情是使用舊人日期存儲爲CHAR和受苦吧:)

當MySQL計算BETWEEN值時,它會這樣做一次,所以會有小數學要做。添加標準優化(準備,參數化,索引等),你應該沒問題。

公式可能有點難以辨認。也許你可以將它們包裝在一個存儲過程中,所以你可以調用GET_LAST_DAY_OF_QUARTER(date),而不是把所有的日期數學放在SELECT中。