Page 1 of 1

我们如何通过添加一个数据库表实现 1,000 倍性能提升

Posted: Sun Mar 02, 2025 4:10 am
by najmulislam
我们都希望事情进展得快。许多研究表明,网站加载时间过长会让用户感到沮丧。像 Google 这样的服务在速度和响应时间方面设定了很高的标准。Google 可以在不到一秒的时间内返回高度复杂的搜索结果。

根据您的网站或网络应用程序的复杂程度,可能需要进行大量的工程设计才能使其快速运行。作为一家数字代理机构,我们必须牢记客户预算的额外限制,有时挤出这几毫秒所需的努力并不值得付出代价。

但有时,我们只需付出一点努力就能获得巨大的性能提升。以下是我们最近通过添加一个数据库表就将我们的一个Ruby on Rails Web 应用程序的速度提高了 1,000 倍(一千倍)的方法!

问题
我们为我们的一位客户开发了一个大型 Rub​​y on Rails Web 应用程序,该应用程序可处理大量数据。该应用程序每分钟从全美 1,300 个地点收集销售和诊断数据。该应用程序为当地、地区和国家经理提供大量报告,用于比较不同产品线和地理区域的销售数据,这些报告按小时、天、周、月和年细分。

所有销售、信息和诊断数据都存储在一个数据库表中,该表目 塞浦路斯 whatsapp 号码数据 前有超过 170,000,000 行。应用程序的大部分报告逻辑都从该表中读取和汇总数据。到目前为止,它实际上表现得非常好,速度足够快,可以满足我们的需求。

然而,最近,我们被要求在应用程序中创建一份新报告,该报告将显示所有地点每条产品线的销售数字,跨越 2 年。报告需要看起来像这样:

不考虑所有细节,系统每天需要花费 4 个小时来处理生成此报告所需的数据。这意味着每天 4 小时内此报告中的数据并非 100% 准确,这不太好。我们会在凌晨 1:00 运行此任务,因此当真正的人需要此报告时,数据就已经存在,但这仍然不是理想的情况。

可能的解决方案
因此,我们思考,如何才能加快这个过程并使其尽可能接近实时?

想法 1:更快的硬件
一种常见的策略是“投入更多硬件来解决问题”,这意味着转向更快的服务器(更多内存、更好的 CPU 等)。这通常是一种相当经济的选择,因为与支付开发团队的费用相比,如今的服务器相对便宜。然而,在这种情况下,我们决定不这样做,原因有两个:

网站已在一些强大的硬件上运行
随着我们每分钟收集和存储越来越多的数据(并且旧数据永远不会被销毁),这个问题只会变得更加严重
我们不想养成为了满足需求而不断“升级”硬件的习惯。服务器相对便宜,但到了一定时候成本就会开始失控。

想法2:优化数据库查询
接下来,我们认为可以对数据库的 SQL 查询进行一些优化。但是,经过进一步检查,我们已经为 MySQL 表添加了适当的数据库索引,似乎没有太多其他可以做的事情。表的大小太大,添加更多索引也可能会使查询变得更糟!

想法 3:汇总表
接下来,我们决定对大型数据库系统或“数据仓库”中常用的汇总表概念进行更多研究。汇总表是您添加到数据库的新表,用于汇总另一个表中包含的数据。在我们的案例中,我们有一个单独的events表,其中包含从所有位置收到的所有数据,精确到秒。但是,我们 Web 应用程序中的几乎所有报告屏幕实际上都只关心“天”时间段,而不是秒。大多数人只关心当天、本周、本月等的销售数据。没有必要显示每秒传入的实时销售数据流。事实上,由于活动如此之多,实时流将无法使用,因为您的眼球无法跟上屏幕!

该表包含每天、每个地点的一行,其中包含当天的销售总额。现在我们的报告可以查询此daily_summary表并比我们的表更快地获得结果events。我们还在此表上添加了一些数据库索引,以进一步加快速度。

你可能会问,到底快多少?

以前,处理1 天的数据需要4 个小时daily_summary。实施表格后,我们现在可以在 14 秒内处理 1 天的数据!速度提高了 1,000 多倍(从 14,400 秒缩短到 14 秒)。

现在,我们可以用过去计算一天的时间来计算两年的数据。

摘要表确实会增加代码的复杂性,因为您必须在有新数据进入时保持它们为最新,但在这种情况下,为了获得巨大的性能提升,这种权衡是值得的。