Zaman serilerini bir MySQL veritabanında depolamak istiyorum. Bunu lineer bir şekilde yapmak isterim, yani her sıra benzersiz bir gözlem (1 ölçü, 1 site, 1 zaman damgası) anlamına gelir. Şu anda, 84 096 000
satır gerektirecek ve yılda yaklaşık 2 102 400
satır büyüyecek. Zaman serisi tablosu, indeksler ve ilgili sorguların (temel olarak ölçü, alan ve zaman aralığının belirlendiği bir veri seçimi) doğru bir şekilde tasarlanması için ne gibi önlemler alınmalıdır.Zaman tablosu veritabanı doğrusal depolama alanı
Düzenleme:
masa tasarımının bir öneri Ekleme: Sağlanan ölçün ve Site tablo var
CREATE TABLE TimeSeries(
Id INT NOT NULL AUTO_INCREMENT,
MeasureTimeStamp DATETIME NOT NULL,
MeasureId INT NOT NULL,
SiteId INT NOT NULL,
Measure FLOAT NOT NULL,
Quality INT NOT NULL,
PRIMARY KEY (Id),
CONSTRAINT UNIQUE (MeasureTimeStamp,MeasureId,SiteId),
FOREIGN KEY (MeasureId) REFERENCES Measure(Id),
FOREIGN KEY (SiteId) REFERENCES Site(Id)
);
CREATE INDEX ChannelIndex ON TimeSeries(MeasureId,SiteId);
, bu yapıya geliştirilmeli ya benim büyük sorguları ise:
SELECT *
FROM TimeSeries
WHERE (MeasureId IN (?,?,?))
AND (SiteId IN (?,?,?))
AND (MeasureTimeStamp BETWEEN ? AND ?)
ORDER BY MeasureId ASC,
SiteId ASC,
MeasureTimeStamp ASC;
Düzenleme 2:
Siteler yaklaşık 20'dir ve önlemler yaklaşık 50'dir. Bu, maksimum 1000 kanala (alan ve ölçü çifti) yol açar. Birkaç on yıl içinde biraz artabilir ancak 10000'den fazla kanala ulaşamaz. Verilerin çoğu yaklaşık 30 dakikalık bir zaman granülitesine sahiptir. Neyse zaman granülite sabit değildir ve bir dakikadan daha küçük olmayacaktır (bazı veriler günlük veya haftalıktır).
MySQL kolayca işleyebilir. Ne tür WHERE cümleleri bekliyorsunuz? Minimal, "site" için bir dizin. – mainstreetmark
'WHERE' maddesi, en azından, 'IN' listesi ölçütü (bu sütunlar elbette dizine eklenecektir) ve' BETWEEN 'kullanarak' timestamp '(' index ') kullanılarak 'site' ve' measure' iki yabancı anahtar üzerinde seçim yapacaktır. birincil anahtarın bir kısmı). – jlandercy
Daha sonra hem 'site' hem de 'measure' ile bir dizin oluşturmanızı öneriyorum. Bu iki sütun, sonuçları verimli olacak kadar azaltacaktır. Karıştırmaya Timestamp eklerseniz, dizininizde veri tablosunda olduğu kadar çok satır bulunur ve MySQL bunu göz ardı eder. – mainstreetmark