1

時間に関連する温度データを追跡するシステムを継承しました。私は以前にそれについて質問しました: (温度値のコレクションを 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;
4

1 に答える 1