选择数据库以每天插入数百万行来为每个用户绘制图表

Posted

技术标签:

【中文标题】选择数据库以每天插入数百万行来为每个用户绘制图表【英文标题】:Selection of Database to insert millions of rows everyday to plot graph for each user 【发布时间】:2019-09-15 20:33:25 【问题描述】:

我正在编写一个微服务,它需要存储和检索大量净值与时间的数据来绘制图表。

基本上我需要通过 cron 为每个用户的净资产存储大量数据。

用户可以投资的共同基金有 20K。目前,有 8000 万用户,其中 2000 万投资了多个共同基金。这些数字正在迅速增长。

共同基金的价值每天在数据库中更新。使用共同基金的最新价值,更新所有用户的净值。

现在我的挑战是创建可扩展的设计来存储 (user_id, networth, date) 以绘制用户第一次投资时的图表。

我的问题如下:

    我应该使用什么数据库?

    一旦选择了数据库,有哪些方法可以实现每天插入约 1 亿条记录的可伸缩性。

更新: 从用户进行第一次投资开始,就需要存储数据。为简单起见,您可以假设每个用户使用 5 年。

对任何数据库开放。更喜欢图形数据库。

谢谢。

【问题讨论】:

它看起来不像是非常庞大的数据集——这种元组的一个实例可以存储为 24 个字节(假设用户 id 很长),所以 100mm 只是 ~2.2Gb。您需要提供有关您的要求的更多详细信息。您期望写入此 100 毫米记录的时间范围是多少(一天中,1 小时窗口等)?这些记录是如何生成的——批量、滴答等?绘图将如何工作 - 它是交互式的,还是可以等待它?等等 时间范围不是问题。记录是批量生成的。是的,绘图需要是交互式的。 【参考方案1】:

据我了解,每天都会为每个用户生成新数据,正如问题中提到的,所需的容量是每天插入 1 亿行。但是,重要的是要知道过去多长时间的记录需要保存在数据库中?数据需要保存一个月、一年还是五年?假设趋势图使用过去全年的数据,那么所需的总行数将为 1 亿 * 365(天),即 365 亿行,即 360 亿行。假设一行占用 24 字节,所需的总容量约为 1TB(四舍五入)。为所有用户存储 1 年的数据会很好。年底可以归档数据,明年年初可以恢复满容量。

考虑到数据不需要 ACID 支持,因为它不是事务性数据,并且数据在不同实体之间没有任何关系,因此 NoSQL 数据库似乎很适合这里。假设批处理作业将同时运行并为所有 1 亿用户插入更新后的净资产,似乎有必要将这个插入时间保持得很短。在这里,像 Cassandra 这样具有快速写入支持的键值对数据库似乎是一个不错的选择。分区键将是用户 ID。此外,数据的性质是不可变的,因此 Cassandra 的底层数据存储结构仅是附加的,这使得它更加适合。

由于数据是不可变的,因此非常适合缓存。根据缓存的容量,可以将所有或部分每日活跃用户的数据保存在缓存中,以服务于绘制图表所需的查询。 LRU Cache 可能是一个不错的选择。

注意:如果 NoSQL 数据库不是一个选项,基于用户 ID 分区的关系数据库也可以完成这项工作。

希望能给点指点,如果除了问题中提到的使用场景之外还有其他使用场景,答案可以改变。

【讨论】:

以上是关于选择数据库以每天插入数百万行来为每个用户绘制图表的主要内容,如果未能解决你的问题,请参考以下文章

xampp phpmyadmin 可以处理数百万行吗?

在包含数百万行和多个过滤器的表上创建哪些索引

是否可以使用 ClickHouse 查询数百万行

具有数百万行的 Django 表

数百万行的数据库设计

如何在 SQL Server 中更新具有数百万行的大表?