一旦我们的数据库变得太慢,我该如何创建按需报告?

How can I create on-demand reports once they become too slow for our DB?

我们的应用/数据

我们有一个 Python 应用,在 Transaction 中有 User,有 CommissionFee 等,Contacts 接收 EmailMessages,其中 Activitys 发生在(Documents 上传,Status 更改等)。

我们的报告

我们为客户生成电子表格报告,详细说明上传到交易的文件数量、赚取的各种佣金总额、收取的费用、活动等信息。在某些情况下,这些报告提供统计数据一个客户的帐户,针对给定年份的每个月(每个月在电子表格中各自的行中)。

我们的问题

尽管我们努力优化查询、添加索引,并且尽管我们只使用 SSD,但我们的 Web 应用程序已经达到了这样一个程度,即我们生成的某些电子表格报告需要几分钟才能生成(全部在 Postgres 上等待)并有足够的 RAM 将数据库装入内存。从本质上讲,我们已经达到了这样一种规模,一些基本报告变得过于昂贵 运行 作为对我们的生产数据库的简单聚合查询。

我正在考虑的解决方案

  1. 将统计信息反规范化到 Postgres 中的现有表中
  2. Memcached 中的缓存统计信息
  3. 通过将一些 c运行ching 移动到 Python
  4. 中来减少/简化查询
  5. 运行 队列中的昂贵报告,并在他们准备好时通知管理员
  6. 将统计数据存储在单独的报告表(星型模式等)中
  7. 分片

我已经在一定程度上使用了上面的选项 1-4,但我想探索更多选项。此外,如果可能的话,我想完全停止使用选项 4,并且我不太热衷于实施选项 5(与简单地使用 Redshift 之类的东西相比)。在某些情况下,选项 6 是一个不错的选择,但我们目前不准备采用它。

我应该看哪里?

我开始真正研究 Redshift,但今天早上读到 (here) 时让我陷入困境的是“它不是实时分析引擎。”这是否也意味着“它对于在单个网络请求中生成报告没有用”,或者这个博客更有可能声明它对实时应用程序没有用(网游等)?

我也看过 Quicksight,但它似乎更适合为我们自己构建业务仪表板,而不是为我们的用户生成报告。

根据以上信息,您将如何解决这个问题? Redshift 是显而易见的答案吗?我上面关于 不利于实时 的担忧是没有意义的吗?在这种情况下,是否有其他一些服务、工具或方法对您更有意义?

这绝对意味着 Redshift 不适合实时加载和报告。 Redshift 是一个基于列的数据库,因此写入它(相对)昂贵,而与基于行的数据库(如 MySQL)相比,读取速度快如闪电。

这意味着 Redshift 非常适合需要读取大量数据的查询,但您应该批量加载到 Redshift。

我已经多次使用 Redshift 来处理类似您的用例。生产数据每天多次克隆到 Redshift 中(比如每 30 分钟一次,增量地进行。有许多供应商可以为您做这件事)。每当需要报告时,查询都会访问 Redshift 而不是生产数据库。查询不仅 运行 更快,而且不会锁定您的生产数据库。

此外,如果查询 return 次仍然不够快,您不满意。您可以设置数据管道来创建汇总表。您可以点击这些汇总表

,而不是查询每个报告的原始 t运行saction 数据

SELECT date(transaction_date) as day, count(1) as transactions
FROM transactions
GROUP BY day 
ORDER BY day

可能会变成

SELECT day, transactions
FROM transactions_summary_by_day

权衡是延迟。由于您不会经常写入 Redshift,因此从 Redshift 提取的任何报告都只会包含最新写入批次的数据。也许是 30 分钟,也许是 1 天,这取决于您的设置。数据管道将增加这种延迟,因为基于它们构建的报告仅使用自上次以来的数据 运行,这依赖于当时加载的 Redshift 数据。

如果您的用户需要真实的 "real-time" 报告,这可能会破坏交易。但是,如果它们以数天或数周为单位工作,为了获得快速加载报告,延迟一个小时左右是值得的。