我繼承了一個跟蹤與時間有關的溫度數據的系統。我曾問過一個關於它的問題:(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;