共通のフィールドに基づいてデータを結合する必要がある 3 つのテーブルがあります。
サンプル疑似テーブル定義:
barometer_log (デバイス、圧力フロート、sampleTime タイムスタンプ)
temperature_log (デバイス整数、温度フロート、sampleTime タイムスタンプ)
Magnitude_log (デバイス int、マグニチュードfloat、utcTime タイムスタンプ)
各テーブルには最終的に数十億行が含まれますが、現在はそれぞれ約 500,000 行が含まれています。
テーブルからのデータ (FULL JOIN) を結合して、sampleTimeが 1 つの列 (COALESE) としてマージされ 、デバイス、サンプル時間、圧力、温度、マグニチュードとして行が得られるようにする必要があります。
デバイスと開始日と終了日を指定してデータをクエリできるようにする必要があります 。
MySql full join (union) and order on multiple date columnsおよびMySql full join (union) and order on multiple date columnsで提案されているように、RIGHT 結合と LEFT 結合を使用して別の UNION ALL 手法を試しましたが、クエリに時間がかかりすぎて、停止するか、何時間も実行した後に一時ファイルのサイズに関するエラーをスローします。3 つのテーブルにクエリを実行し、許容できる時間枠内でそれらの出力をマージするにはどうすればよいですか?
提案されている完全なテーブル定義を次に示します。注: デバイス テーブルは含まれていません。
マグニチュード_ログ
CREATE TABLE magnitude_log (
device int(11) NOT NULL,
magnitude float not NULL,
sampleTime timestamp NOT NULL,
PRIMARY KEY (device,sampleTime),
CONSTRAINT magnitudeLog_device
FOREIGN KEY (device)
REFERENCES device (id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
barometer_log
CREATE TABLE barometer_log (
device int(11) NOT NULL,
pressure float not NULL,
sampleTime timestamp NOT NULL,
PRIMARY KEY (device,sampleTime),
CONSTRAINT barometerLog_device
FOREIGN KEY (device)
REFERENCES device (id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
温度_ログ
CREATE TABLE temperature_log (
device int(11) NOT NULL,
sampleTime timestamp NOT NULL,
temperature float default NULL,
PRIMARY KEY (device,sampleTime),
CONSTRAINT temperatureLog_device
FOREIGN KEY (device)
REFERENCES device (id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;