首页 > 解决方案 > 在数据库中存储数千万条记录的最佳选择是什么?

问题描述

我正在为某位交易员工作,他想建立一个相对庞大的股票报价档案以供进一步分析。我们可以访问信息提供者,并且数据始终具有相同的结构:股票代码名称、时间戳和 OHLC,因此它适合关系数据库方法。到目前为止,我使用 Ruby on Rails(Ruby 2.6、Rails 6.0)和 PostgreSQL 制作了一个工作原型。它可以非常快地从提供者那里获取数据,但是将数百万条记录存储到数据库中非常慢。我从 ActiveRecord 样式切换到纯 SQL,它使它快了 3 倍,但是存储少量所需数据仍然是一个非常长的过程。所以我需要以某种方式提高原型的性能,但不知道该怎么做。我当然可以使用 Redis 之类的东西,但无论如何我都需要将数据存储到持久存储中。

标签: ruby-on-railsrubypostgresqlstocktrading

解决方案


这个问题可能会被标记,但无论如何我都会给你一个答案:

ActiveRecord 不一定很慢。ActiveModel 很慢。

ActiveModel 将您的结果集和数据库类型映射到对 ruby​​ 友好的对象,并将您的数据(字符串-y 事物)转换为数据库类型以进行插入/更新。

如果您正在渲染 JSON,请确保您使用的是 C 渲染器 OJ 或类似的:https ://github.com/ohler55/oj - 它对更大的数据集和响应有很大的不同。

如果您对作为可以循环遍历的哈希的结果集感到满意,则可以避免使用以下命令访问 ActiveModel connection#exec_query

stocks_query = Stock.all
results = Stock.connection.exec_query(stocks_query.to_sql).to_a 

results.each do |result|
  puts result 
end

如果您要插入数百万行,甚至更新数百万行,您可能应该使用正确的工具来完成这项工作:原始 SQL。但这变得笨拙,而且你喜欢 ruby​​,所以你可以使用类似https://github.com/zdennis/activerecord-import的东西,它可以让你编写 ruby​​,它会处理剩下的事情。

几千万条记录并不多。PostgreSQL 可能是您最好的选择,而不会引入大量不必要的复杂性。您只需要知道使用 Rails 与数据库层通信的瓶颈,以及如何解决这些瓶颈。确保您的数据库也被正确索引。如果您不确定,https://github.com/plentz/lol_dba是一个不错的起点。


推荐阅读