0

有一个类似的问题Large data - storage and query 但我认为我的问题更难。

我有一个庞大的数据集,为了简化问题,假设每条记录有 3 个字段,

日期、地点、对象

表示在哪一天,对象访问了哪个地方。

每天可以有 5000 万条新记录。我需要保留 100 天的数据。

查询如下:

  1. 给定一个日期范围,列出所有访问过特定位置 X 的对象;
  2. 给定日期范围,列出特定对象访问过的所有位置。

我应该如何设计这个?有没有可能给出解决方案?我应该尝试任何工具吗?我可以使用 mongodb 或 hadoop 吗?

更重要的是,查询应该不会花费很长时间,因为它将从前端查询。

谢谢。

4

2 回答 2

1

您描述的查询非常适合关系数据库。虽然您将拥有大量数据,但查询很适合相当简单的索引方案。

一些商业数据库具有地理空间扩展,允许您将查询扩展到“给定日期范围,告诉我哪些对象位于位置 x 的 20 公里范围内”。

看起来虽然您有大量行,但实际数据大小相当有限;期望它适合高端机器的内存并不是没有道理的。

大多数数据库系统可以处理非常大的表——RDBMS 保存的记录数量没有逻辑限制,但显然存在实际限制。Oracle 在处理大型数据集的性能方面享有盛誉,但绝对值得有经验丰富的 Oracle DBA 提供帮助。处理大量数据时的一种常见策略是“分片”——将不同的记录放在不同的表和/或服务器中。例如,如果您的所有查询都是基于日期的,您可能会将每个月的数据放在不同的物理服务器上。

我将从 RDBMS 开始,创建一个测试数据集以通过运行和调整示例查询来确定它是否满足您的可伸缩性需求。调整硬件,如果你负担得起,可以添加更多。

我认为你不会从 Hadoop 中获得太多好处——你没有做太多的处理,你只是在搜索一个大型数据集。

MongoDB 旨在处理文档样式的数据;您的数据在本质上似乎是相关的,而不是文档。你可以在 MongoDB 中构建它,但我不确定你会得到多少好处。

于 2013-01-18T12:20:22.300 回答
0

这个问题并不像听起来那么难。您需要两个索引:

(Location, Date, Object)
(Object, Date, Location)

这两个索引可以最佳地满足您的查询。您无需担心固有的可扩展性限制。

您可能会考虑分区,Date以便您可以有效地删除旧分区。

于 2013-01-18T12:05:06.213 回答