機械の情報 (現在の速度、ガス使用量など) を保持する 1,500 万件のレコードを含むテーブルがあります。
現在の速度は 1 分ごとに保存され、ガスの使用量は 15 分ごとに保存されます。ここで、この 15 分間のガス使用量と平均速度のリストが必要です。
select a.time, a.value as gas,
(select avg(b.value) from machine_values as b where b.time < a.time
and b.time > date_add(a.time, interval -15 minute) and b.channel='speed') as avgSpeed
from machine_values as a
where a.time >= '2012-12-16 00:00:00.000' and a.time < '2012-12-17 00:00:00.000'
and a.channel='gas'
machine_values.time
およびmachine_values.channel
は、このテーブルの主キーです。
1日の値でこれを試しましたが、クエリは約30分実行されます。サブクエリに 1 日の期間を追加すると、クエリの実行速度が大幅に向上します。
select a.time, a.value as gas,
(select avg(b.value) from machine_values as b where b.time < a.time
and b.time > date_add(a.time, interval -15 minute) and b.channel='speed'
and b.time >= '2012-12-16 00:00:00.000' and b.time < '2012-12-17 00:00:00.000') as avgSpeed
from machine_values as a
where a.time >= '2012-12-16 00:00:00.000' and a.time < '2012-12-17 00:00:00.000'
and a.channel='gas'
でもそれも一日限り。これを 2 か月試した場合、結果が出るまでに約 1 時間かかります。どうしたの?サブクエリはa.time
行単位で参照していませんか?
私はそれを推測しました-もし私が1つの行を持っていてa.time = 2012-12-16 00:20:00
、a.gas = 100
サブクエリが2012-12-16 00:05:00
までの値のみを選択するなら2012-12-16 00:20:00
? しかし、クエリのパフォーマンスは、サブクエリが毎回テーブル全体をスキャンするように見えます。
必要な結果を得る別の (より高速な) 方法はありますか?