センサー、読み取り値、および読み取り値が取得されたタイムスタンプを示す測定値のデータベースがあります。測定値は、変更がある場合にのみ記録されます。各センサーが特定の測定値を読み取っている範囲を示す結果セットを生成したいと考えています。
タイムスタンプはミリ秒単位ですが、結果を秒単位で出力しています。
ここにテーブルがあります:
CREATE TABLE `raw_metric` (
`row_id` BIGINT NOT NULL AUTO_INCREMENT,
`sensor_id` BINARY(6) NOT NULL,
`timestamp` BIGINT NOT NULL,
`angle` FLOAT NOT NULL,
PRIMARY KEY (`row_id`)
)
現在、サブクエリを使用して必要な結果を取得していますが、データポイントが多いとかなり遅くなります。
SELECT row_id,
HEX(sensor_id),
angle,
(
COALESCE((
SELECT MIN(`timestamp`)
FROM raw_metric AS rm2
WHERE rm2.`timestamp` > rm1.`timestamp`
AND rm2.sensor_id = rm1.sensor_id
), UNIX_TIMESTAMP() * 1000) - `timestamp`
) / 1000 AS duration
FROM raw_metric AS rm1
基本的に、範囲を取得するには、次の読み取り値を取得する必要があります (または、別の読み取り値がない場合は現在の時刻を使用します)。サブクエリは、現在のタイムスタンプよりも遅いが同じセンサーからの最小タイムスタンプを見つけます。
このクエリは頻繁には発生しないため、タイムスタンプ列にインデックスを追加して挿入を遅くする必要はありません。これを行う別の方法について誰かが提案してくれることを望んでいました。
更新: row_idはタイムスタンプと共にインクリメントする必要がありますが、ネットワーク遅延の問題により保証できません。そのため、可能性は低いですが、より低い row_id を持つエントリが後の row_id の後に発生する可能性があります。