首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >时序数据库线性存储

时序数据库线性存储
EN

Stack Overflow用户
提问于 2014-11-08 08:51:44
回答 1查看 220关注 0票数 5

我想将时间序列存储在MySQL数据库中。我想用线性的方式来做,也就是说,每一行代表一个独特的观察(1度量,1站点,1时间戳)。目前,它将需要84 096 000行,并且每年大约会增长2 102 400行。

为了正确设计时间序列表、索引和相关查询,必须采取哪些预防措施(基本上是确定测量、地点和时间范围的数据的选择)。

编辑:

增加表格设计方案:

代码语言:javascript
运行
复制
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);

如果存在度量值和站点表,如果我的主要查询是:

代码语言:javascript
运行
复制
SELECT *
FROM TimeSeries
WHERE (MeasureId IN (?,?,?)) 
  AND (SiteId IN (?,?,?))
  AND (MeasureTimeStamp BETWEEN ? AND ?)
ORDER BY MeasureId ASC,
         SiteId ASC,
         MeasureTimeStamp ASC;

编辑2:

地点约为20个,措施约为50个。这将导致最多1000个通道(一对站点和度量)。它可能会在几十年内有所增加,但不会超过10000个频道。大部分数据的时间颗粒度在30分钟左右。无论如何,时间粒度不是恒定的,而且不会小于一分钟(一些数据是每日或每周的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-23 09:00:26

一些线索:

  • MySQL中的索引是由“索引列”排序的主键列表。您希望将该列表排序,以便尽可能容易地找到所需的值。
  • MySQL一次只对一个表使用一个索引。
  • MySQL可以从左到右使用索引(MySQl多列索引)。这意味着索引(A,B,C)允许您执行WHERE A=? AND B=?,而不是WHERE B=? AND C=?

在您的示例中,创建了四个索引:

  • MeasureId,SiteId (ChannelIndex)
  • MeasureTimeStamp,MeasureId,SiteId (唯一约束)
  • MeasureId (外键)
  • SiteId (外键)

简单地说,ChannelIndex排序就像组合了MeasureId和SiteId的字符串列表一样。例如,对于MeasureId = 12和Site = 68,可以将排序值想象为12_68。您的唯一约束根据像2014-12-23 09:01:43_12_68这样的值进行排序。

要解决查询,MySQL可以使用索引或唯一约束。它取决于它选择的表中的数据。然而,两者都不是最佳选择。使用该索引,它将很快在索引中找到具有正确的MeasureIdSiteId的块,但随后需要进入主表中的每个值,以检查MeasureTimeStamp是否在范围内。使用唯一的约束条件,可以方便地选择时间范围。然而,这个索引子集具有MeasureIdSiteId的随机排序,而MeasureTimeStamp仍然对它们进行排序。

要改进您的结构,它将有助于将您的唯一约束更改为

约束唯一(MeasureId、SiteId、MeasureTimeStamp)

该索引现在将与12_68_2014-12-23 09:01:43这样的值排序,我希望它能显示出更好的性能,因为MySQL现在可以在索引中选择一个离散和可预测的范围数。这将涵盖SELECT语句,并使索引同时冗余。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26815394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档