面向bigdata的MySQL数据库设计
我不是数据库专家,所以我来这里寻求一些帮助。 我有大量的测量数据,我想帮助自己处理数据。以下是我的情况: 有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,因为这是我最熟悉的数据库。我已经读到,它应该可以轻松地处理这么多的数据,但是,我还是很欣赏针对这种情况的任何建议。 再次:面向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个站点,每天3000行=>cca每天30000次插入
- cca需要从二进制文件中插入4000-5000万行
- DB将增长(超过1亿行)
- 我唯一需要的就是尽可能快地选择数据
有人能证实/拒绝我的想法吗?你认为有更好的解决办法吗?非常感谢您的帮助和讨论。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进行分区是否有帮助?