時間に関連する温度データを追跡するシステムを継承しました。私は以前にそれについて質問しました: (温度値のコレクションを MYSQL に保存する最も効率的な方法は何ですか? )
システムには、日付を追跡するために使用される別のテーブルがあります (以下を参照)。現在の日付のいくつかの記述子列が含まれています。私は、この種の構造が提供する利点をためらっています。いくつかの日付関数と数学でできることと同じことを行うには、余分な重みが追加されるように思われるからです。
システムの作成者から、日付関数の代わりに演算子を使用して DATE_ID を使用してデータの範囲を選択する方がよいと言われました。
例: 2012 年 6 月 1 日から 2012 年末までのすべての温度情報を収集したいとします。次のように実行できます。
1) 2012 年 6 月 1 日に対応する日付 ID を取得します。ID が 23000 だったとします。
2) 次のようなものを使用して、年末に対応する日付 ID を取得します。
SELECT DATE_ID FROM DATE_REPRESENTATION WHERE DATE_ID >= 23000 AND END_YEAR_FLAG = 1 AND LIMIT 1;
1が23213だったとしましょう
3) 2 つの DATE_ID があり、次のように使用できます。
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;