Back to BlogCTO 如何在 20 分钟内发现并修复缓慢查询,在财务部门升级前解决问题
Analytics8 min read

CTO 如何在 20 分钟内发现并修复缓慢查询,在财务部门升级前解决问题

NeonEdge 是一个以加密货币为中心的 iGaming 平台,总部位于爱沙尼亚塔林,围绕可证明公平的崩盘游戏构建,支持 ETH、Tron、Polygon 和 SOL 跨多条链。该平台每月约有 15,000 名活跃用户,每周运行约 500 万美元的毛博彩收入 (GGR)。这是一个人员精干且技术宏大的店铺 — 两名工程师拥有整个数据基础设施 — Priya Desai 是 CTO 和数据负责人,当任何东西移动速度不如预期时,产品和财务都会呼叫她。

使用的产品:查询性能分析、基础设施监控、成本优化

20 分钟 | 完整调查时间

3 | 从冷启动中识别的问题查询

12x | 部署优化后的平均加速


挑战

在同一个 48 小时内,投诉来自两个不同的方向。产品团队在 Slack 线程中提交说玩家活动报告感觉缓慢 — "有时你点击并等待,然后放弃"。财务更直白:每周 GGR 对账报告已开始在加载中超时,首席财务官已被迫在页面半渲染时截屏,之后它就崩溃了。没有错误代码,没有明显的故障 — 只是缓慢,它已经悄悄从讨厌变成了坏。

Priya 的标准诊断工具包对这类问题不够快。跨多链数据堆栈追踪查询延迟意味着关联来自三个独立服务的日志,手动检查集群资源利用率,并重建哪个上游转换为哪个下游报告添加时间。在一个有正确日志已浮出水面的好日子,这需要两到三个小时。在坏日子 — 缓慢查询只在负载下出现的那种 — 它可以延伸到整个下午。

根本问题是 NeonEdge 的数据堆栈是有机增长的。早期工程决定 — 在 5,000 名 MAU 时很聪慧 — 当平台穿过 15,000 时尚未重新审视。没有人故意做出跳过索引或将表扫描写入核心报告的选择;它只是发生了,逐渐地,当团队专注于发货功能而不是审计数据访问模式。

"我们是一个两人数据团队,为 15,000 名用户和每周 5 百万美元 GGR 的基础设施运行。我没有奢侈花整天猎捕一个缓慢查询。我需要在 20 分钟内在我的屏幕上看到瓶颈,否则问题要等到下一个冲刺。"

— Priya Desai,CTO,NeonEdge


解决方案

Priya 打开 Gaming Mind AI 并用简单的术语描述了症状:报告很慢,没人知道哪个查询是罪魁祸首,问题已经升级两天。Gaming Mind 连接到 NeonEdge 的基础设施遥测并以最直接的诊断问题开始 — 现在整个堆栈中哪些查询消耗最多执行时间。

以下是调查的展开方式:


Priya:"报告速度很慢。我应该从哪里开始看?"

排名 查询名称 平均执行时间 p99 时间 每天运行次数 调用者 总查询时间百分比
1 GGR 对账报告 41.2 秒 68.4 秒 4 财务 24%
2 玩家活动报告 31.0 秒 54.1 秒 8 产品 22%
3 玩家群组报告 28.3 秒 47.6 秒 6 产品 / CRM 12%
4 联盟收入属性 5.8 秒 11.2 秒 12 营销 4%
5 每日活跃用户汇总 5.1 秒 9.7 秒 24 运营 4%
6 链结算对账 4.9 秒 9.1 秒 6 财务 3%
7 流失风险评分刷新 4.4 秒 8.3 秒 2 CRM 2%
8 钱包余额快照 3.8 秒 7.2 秒 48 运营 2%
9 奖金使用报告 3.2 秒 6.4 秒 4 产品 1%
10 新注册漏斗 2.9 秒 5.8 秒 24 营销 1%
(其他所有) — < 2.0 秒 < 4.0 秒 — 多个 25%
前三名总计 ~100 秒合计 58%
前十名总计 71%

⚠️ Gaming Mind 标记:前三个查询占总查询执行时间的 58%。分布不均 — 查询 1-3 平均 28-41 秒,而查询 4-10 平均不到 6 秒合计。修复前 3 个将减少总查询时间 58%,无需接触任何其他内容。

Gaming Mind 的首个响应是一个涵盖过去七天查询执行的排名延迟排行榜。前十个最慢查询占总查询执行时间的 71%,但分布不均 — 三个最坏的犯人平均 28 到 41 秒,而四到十号平均不到六秒合计。Gaming Mind 标记前三个是唯一值得立即调查的:修复它们将减少总查询时间估计 58%,无需接触任何其他。Priya 在不到 90 秒内有了她的起点。


Priya:"告诉我最慢的那个。"

查询:GGR 对账报告

阶段 操作 行扫描 行输出 阶段时间 累积时间
1 完整表扫描 — transaction_ledger 84,200,000 84,200,000 28.4 秒 28.4 秒
2 过滤:本周记录 84,200,000 312,400 6.1 秒 34.5 秒
3 联接:链元数据 312,400 312,400 2.8 秒 37.3 秒
4 聚合:按链 + 游戏类型的 GGR 312,400 48 1.9 秒 39.2 秒
5 格式输出 48 48 2.0 秒 41.2 秒
诊断 详情
扫描的数据日期范围 平台启动(18 个月)至现在
必需的日期范围 仅当前周
扫描前应用的日期过滤 否
访问模式分类 未过滤的历史扫描
严重程度 🔴 高 — 追加繁重账本架构中的已知性能反模式
根本原因 缺少 WHERE 日期谓词在表扫描前 — 来自 18 个月前从未重新审视的设计决定

⚠️ Gaming Mind 标记:GGR 对账报告 — 财务抱怨的确切查询 — 在 18 个月的交易历史中进行完整表扫描来回答只需要当前周的问题。在扫描前应用日期过滤是所需的单一修复。这是财务首席财务官超时的根本原因。

最坏的查询是 GGR 对账报告 — 正好是财务抱怨的。Gaming Mind 分阶段分解了其执行计划:完整表扫描接触交易账本中的每一行,包括返回到平台启动的历史记录,每次报告运行时。查询在扫描前应用了日期过滤,这意味着它处理了近 18 个月的交易历史来回答只需要当前周的问题。Gaming Mind 将此分类为高严重程度访问模式,并标记为未过滤的历史扫描 — 追加繁重账本架构中的已知性能反模式。根本原因是来自 18 个月前的一个设计决定,没有人重新审视。


Priya:"第二个发生了什么?"

查询:玩家活动报告

阶段 操作 输入行 输出行 阶段时间 累积时间
1 扫描:player_sessions 2,100,000 2,100,000 4.2 秒 4.2 秒
2 联接:game_events(宽,过滤前) 2,100,000 18,700,000 12.8 秒 17.0 秒
3 联接:wallet_activity 18,700,000 18,700,000 7.1 秒 24.1 秒
4 过滤:玩家段 + 日期范围 18,700,000 480,000 4.6 秒 28.7 秒
5 聚合 + 格式 480,000 920 2.3 秒 31.0 秒
诊断 详情
瓶颈阶段 阶段 2 — 在过滤变窄前联接扩展
中间结果集峰值 18,700,000 行(~3 倍必需大小)
原因 联接顺序在最窄过滤前放置宽联接
修复 在与 game_events 的联接前应用玩家段 + 日期过滤
估计修复后中间大小 ~6,200,000 行
估计修复后执行时间 < 5 秒
内存减少 ~66%

⚠️ Gaming Mind 标记:玩家活动报告的联接在过滤前扩展 — 生成中间结果集几乎是必需的 3 倍。反转联接序列中的两个步骤(首先应用最窄过滤)将减少中间内存消耗大约三分之二,并将执行时间从 31 秒带到 5 秒以下。

第二个问题查询为产品团队标记的玩家活动报告提供动力。Gaming Mind 识别了一个在过滤前扩展的多阶段联接 — 处理宽中间结果集在峰值大小,然后按玩家段和日期范围变窄。联接顺序生成大小几乎是必需的三倍的中间表。Gaming Mind 注释了结果集膨胀的确切阶段,并估计反转联接序列中的两个步骤 — 首先应用最窄过滤 — 将中间内存消耗减少大约三分之二,并将执行时间从 31 秒带到 5 秒以下。


Priya:"第三个呢?"

查询:玩家群组报告

列 单个索引存在 复合索引的一部分 基数 时间花费解决交集
chain_identifier 是 否 低(4 个值) —
registration_date 是 否 高(540 天) —
game_category 是 否 中(12 个值) —
chain_identifier + registration_date + game_category 否 否 — 每次执行 ~19 秒
诊断 详情
缺少索引类型 (chain_identifier、registration_date、game_category)上的复合索引
当前分辨率方法 在查询时手动交集
使用复合索引的估计执行时间 < 3 秒
跨平台使用此列组合的查询 14 个不同查询
添加 1 个复合索引加速的其他查询 13
严重程度 🔴 高 — 单一修复,平台级影响

⚠️ Gaming Mind 标记:出现在此查询每个版本中的三列 — chain_identifier、registration_date 和 game_category — 各自被索引但从不作为复合索引。添加一个复合索引将消除手动交集工作,并同时加速群组报告加 13 个其他平台查询。

第三个慢查询是玩家群组报告,由产品和 CRM 团队每周使用。Gaming Mind 浮出了一个索引覆盖间隙:三列出现在此查询的每个版本中 — 链标识符、注册日期和游戏类别 — 各自被索引但从不作为复合索引。每次执行都在查询时手动解决交集,做一个单一复合索引会完全消除的工作。Gaming Mind 指出这个列组合出现在平台上 14 个不同的查询中,意味着单一索引添加将加速群组报告和 13 个其他查询同时。


Priya:"在这些运行时显示我跨集群的资源消耗。"

14 天资源利用 — 峰值计划报告窗口

日期 报告窗口 CPU 峰值 内存峰值 I/O 峰值 并发缓慢查询 队列级联?
第 1 天 09:00–09:45 74% 71% 68% 1 否
第 2 天 09:00–09:45 78% 76% 72% 1 否
第 3 天 09:00–09:45 81% 79% 75% 2 否
第 4 天 09:00–09:45 76% 74% 71% 1 否
第 5 天 09:00–09:45 82% 89% 84% 2 是
第 6 天 09:00–09:45 77% 75% 73% 1 否
第 7 天 09:00–09:45 79% 77% 74% 1 否
第 8 天 09:00–09:45 83% 89% 85% 2 是
第 9 天 09:00–09:45 75% 73% 70% 1 否
第 10 天 09:00–09:45 84% 91% 87% 2 是
第 11–14 天 09:00–09:45 72–78% 70–76% 67–73% 0–1 否

风险摘要

指标 值
并发缓慢查询运行期间的内存上限 89–91%
过去 10 天中的级联事件 3
级联触发器 GGR 对账 + 玩家活动同时运行
风险分类 🔴 集群稳定性风险

⚠️ Gaming Mind 标记:每次 CPU 和 I/O 利用率峰值与计划报告运行同时出现。过去 10 天中有 3 次,GGR 对账和玩家活动报告的并发执行将内存推到 89% 以上,触发队列延迟级联到其他工作负载 — 包括财务首席财务官超时。这不仅仅是一个缓慢查询问题。这是一个集群稳定性风险。

Gaming Mind 将三个缓慢查询窗口叠加到 NeonEdge 的集群资源热图上过去两周。模式是不可否认的:每次 CPU 和 I/O 利用率峰值与计划报告运行同时出现,集群在第一两个查询的并发执行期间在内存上接近容量。在过去十天中的三次场合,GGR 对账和玩家活动报告的并发执行已将内存利用率推到 89% 以上,触发查询队列延迟级联到其他工作负载 — 包括首席财务官经历的财务超时。这不仅仅是一个缓慢查询问题。这是一个集群稳定性风险。


Priya:"我如何优先考虑这三个修复?我应该先做哪一个?"

修复 查询 估计加速 实施工作 部署风险 查询受影响 推荐顺序
添加复合索引(chain_id + reg_date + game_cat) 玩家群组报告 ~9x 低(< 1 小时) 非常低 14 个查询 1 — 今天部署
重写联接顺序(过滤前扩展) 玩家活动报告 ~6x 中(3–4 小时) 低(在分级测试) 1 个查询 2 — 分级后部署
在表扫描前添加日期谓词 GGR 对账 ~12x 中(2–3 小时) 中(财务计划依赖) 1 个查询 + 缓存合格性 3 — 下一个财务维护窗口

评分详情

修复 加速评分 工作评分 风险评分 影响范围评分 总优先级评分
复合索引 3/5 5/5 5/5 5/5 18/20
联接重写 4/5 3/5 4/5 2/5 13/20
日期谓词 5/5 3/5 3/5 3/5 14/20

⚠️ Gaming Mind 标记:首先部署复合索引 — 最低风险,最快实施,跨 14 个平台查询最广泛的正面影响。GGR 联接重写具有最高的单独加速(估计 12x),但在部署前需要对财务的确切报告参数进行分级验证。表扫描修复必须与财务的维护窗口协调后才能部署。

Gaming Mind 生成了一个优先级矩阵,在四个维度上评分每个修复:估计加速、实施复杂性、部署风险和下游影响的广度。复合索引排名第一 — 最低风险,最快部署,对平台 14 个受影响查询的最广泛正面影响。GGR 联接重写排名第二:最高的单别加速,估计 12 倍改进,但在部署前需要针对财务的确切报告参数仔细测试。未过滤的表扫描修复排名第三 — 也具有高影响力,但涉及财务在固定周期计划上运行的报告的日期过滤变更,这意味着协调部署窗口。Gaming Mind 建议首先部署索引,在分级测试联接重写,并为下一个财务维护窗口安排表扫描修复。


Priya:"如果我修复全部三个,估计的总加速是多少?"

优化后预期性能

查询 前 后 加速
GGR 对账报告 41.2 秒 3.4 秒 ~12x
玩家活动报告 31.0 秒 4.8 秒 ~6x
玩家群组报告 28.3 秒 3.1 秒 ~9x
平均报告生成合计 45.0 秒 < 4.0 秒 > 11x

集群资源余量

指标 修复前 修复后 变化
内存利用率(并发报告运行) 89%(上限) ~34% -55pp
每 10 天队列级联事件 3 0(预期) 已消除
首席财务官报告超时风险 活跃 无 已消除

二级优势 — GGR 对账缓存

详情 值
修复后缓存合格性 是(日期谓词启用预计算)
估计月度计算成本减少 ~60%
标记此优势的模块 成本优化

⚠️ Gaming Mind 标记:三个修复合计预计将平均报告生成时间从 45 秒减少到 4 秒以下 — 减少 90%+。集群内存在峰值计划运行期间将从 89% 下降到 ~34%,完全消除级联队列风险。该投影还标记一个二级优势:随着未过滤表扫描的解决,GGR 对账报告将成为预计算缓存的合格者,Gaming Mind 的成本优化模块估计将该报告的月度计算支出减少约 60%。

Gaming Mind 建模了组合效应。三个修复合计预计将平均报告生成时间从 45 秒减少到 4 秒以下 — 减少 90%。峰值计划运行期间集群内存利用率预计将从当前 89% 上限下降到约 34%,完全消除队列级联风险。该投影还标记了一个二级优势:随着未过滤表扫描的解决,GGR 对账报告将成为预计算缓存的合格者,Gaming Mind 的成本优化模块估计将该报告的月度计算支出减少约 60%。

"我走进来期望花下午在日志文件中。Gaming Mind 在 20 分钟内对三个查询进行了排名、分析和优先级排序。我只需要写代码。"

— Priya Desai


结果

20 分钟内从冷启动完成调查

Priya 没有为查询性能构建的预先构建的仪表板,也没有开放的事件来跟踪。Gaming Mind 拉入遥测,排名犯人,并在单一对话中生成了部署有序的修复列表。零日志文件打开,零支持票提交,零工程师被拉离其他工作。

三个根本原因跨三个不同问题类型识别

每个缓慢查询都有结构上不同的原因 — 未过滤的历史扫描、次优联接顺序和缺少的复合索引。Gaming Mind 诊断了全部三个,并用 Priya 可以直接与工程团队沟通而无需翻译的简单术语解释了每一个。调查浮出了积累数月的问题,而不仅仅是过去 48 小时报告的症状。

修复部署后 12 倍的平均加速

复合索引在同一天下午上线。联接重写通过分级测试在当天结束,并在第二天上午部署。表扫描修复与财务协调,并在下一个维护窗口部署。在全部三个变更后,平均报告生成时间从 45 秒下降到 3 秒 42 秒 — 根据平台自己的遥测测量的 12 倍改进。

集群稳定性风险在成为事件前消除

内存利用率上限 — 在并发报告运行期间已悄悄推到 89% — 修复后下降到 34%。过去十天发生的三个级联事件是集群在负载下接近故障的早期警告信号。Gaming Mind 从资源热图分析浮出了此风险;没有它,下一个事件可能是在高流量周末会话期间的完整报告中断。

协议报告月度计算成本预期下降 60%

成本优化模块标记了 GGR 对账报告的修复后缓存合格性。Priya 的团队在初始修复后两周实施了缓存层,以下月的那个报告工作负载的基础设施账单来在 38% 的先前基线 — 略好于预期。

"集群距离真实中断三个坏的周日,我们不知道。性能调查发现了缓慢的查询,但资源热图发现了稳定性风险。这是实际吓了我 — 也是我最高兴我们在它抓住我们之前抓住的部分。"

— Priya Desai,CTO,NeonEdge

Want to see how Gaming Mind AI can help your operation?

Get a Demo