面向bigdata的MySQL数据库设计

面向bigdata的MySQL数据库设计,mysql,sql,database,database-design,bigdata,Mysql,Sql,Database,Database Design,Bigdata,我不是数据库专家,所以我来这里寻求一些帮助。 我有大量的测量数据,我想帮助自己处理数据。以下是我的情况: 有10个cca站,每天测量。每天,我们都会产生cca 3000行(cca 15列)的数据。数据必须每天从每个站点下载一次到集中服务器。这意味着cca每天向数据库中插入30000行。(每日计数是可变的) 现在,我已经有了过去几年的数据,所以对于每个站点,我都有几百万行。也有20个“死亡”台站——不再工作了,但有几年的数据。 总之,我们将获得cca 5000+百万行,由30个站点生成,每天插入3

我不是数据库专家,所以我来这里寻求一些帮助。 我有大量的测量数据,我想帮助自己处理数据。以下是我的情况: 有10个cca站,每天测量。每天,我们都会产生cca 3000行(cca 15列)的数据。数据必须每天从每个站点下载一次到集中服务器。这意味着cca每天向数据库中插入30000行。(每日计数是可变的)

现在,我已经有了过去几年的数据,所以对于每个站点,我都有几百万行。也有20个“死亡”台站——不再工作了,但有几年的数据。 总之,我们将获得cca 5000+百万行,由30个站点生成,每天插入30000行。展望未来,让我们假设数据库中有1亿行

我的问题很明显-您建议如何存储这些数据? 测量值(列)只是数字(int或double+datetime)-没有文本或全文搜索,基本上我需要的唯一索引是datetime。 数据不会被更新,也不会被删除。我只需要快速选择一系列数据(例如,从2010年1月1日到2010年2月3日)

正如我所写的,我想使用MySQL,因为这是我最熟悉的数据库。我已经读到,它应该可以轻松地处理这么多的数据,但是,我还是很欣赏针对这种情况的任何建议。 再次:

  • 10个站点,每天3000行=>cca每天30000次插入
  • cca需要从二进制文件中插入4000-5000万行
  • DB将增长(超过1亿行)
  • 我唯一需要的就是尽可能快地选择数据
据我所知,MySQL应该处理这么多的数据。我也知道,我唯一的索引将是DATETIME类型中的日期和时间(应该比其他类型更快,对吗?) 我无法决定的是,是创建一个包含5000多万行(带有站点id)的大型表,还是分别为每个站点创建表。基本上,我不需要在这些站点上执行任何连接。如果我需要进行时间重合,我可以在站点上选择相同的时间范围。这些方法有什么缺点/优点吗


有人能证实/拒绝我的想法吗?你认为有更好的解决办法吗?非常感谢您的帮助和讨论。

MySQL应该能够很好地处理这一问题。我建议您创建两个复合索引,如下所示,而不是只为
DATETIME
列编制索引:

(datetime, station)
(station, datetime)
有了这两个索引,将有助于加速选择日期范围和按站点分组的查询,反之亦然。第一个索引也将起到索引
datetime
的作用

您没有告诉我们您的典型查询是什么。您也没有告诉我们您是否计划淘汰旧数据。您的数据显然是范围分区()的候选对象,但我们需要更多信息来帮助您设计可行的分区标准

阅读评论后编辑

在构建此系统时,需要记住几件事

首先,现在不必担心分区

第二,我可以用一张桌子让所有东西都工作。不要按站点或年份划分内容。为你的MySQL服务器准备一个你能负担得起的最快的磁盘存储系统和大量的RAM,你应该会没事的

第三,每隔一段时间花一些时间来优化表;这将确保你的索引是好的

第四,除非您知道需要表中的所有列,否则不要使用
SELECT*
。为什么?因为

      SELECT datetime, station, temp, dewpoint
        FROM table
       WHERE datetime >= DATE(NOW() - INTERVAL 60 DAY)
       ORDER BY station, datetime
可以直接从顺序访问上的复合覆盖索引中得到满足

     (station, datetime, temp, dewpoint)
鉴于

      SELECT *
        FROM table
       WHERE datetime >= DATE(NOW() - INTERVAL 60 DAY)
       ORDER BY station, datetime
需要随机访问您的表。你应该仔细阅读复合覆盖索引

第五,避免在
WHERE
子句中使用带有列名的函数。别说

      WHERE YEAR(datetime) >= 2003 
或者诸如此类的。MySQL不能使用索引进行这种查询。而是说

      WHERE datetime >= '2003-01-01'

允许索引被利用。

我认为他的意思是“circa”,它是拉丁语中“大约”或“大约”的意思。1亿行虽然不小,但现在不被认为是“大数据”。)这对我来说是相当大的数据:是的,cca大约是,对不起。这些数字是我的估计值。我的典型查询是
SELECT*fromstation1\u数据,其中datetime介于
之间。如果所有内容都是一个巨大的表,那么
SELECT*FROM data,其中datetime介于。。。和站点id=1
。旧数据不应视为旧数据。它们在这里,和新的一样有用。人们将处理数据,并希望一切可用。据我所知,你建议一张有车站id的大桌子,对吗?配药很有趣,我不知道。对站点id进行分区是否有帮助?