Back to BlogCTO 如何在 20 分鐘內找出慢查詢並在財務升級前修復
Analytics8 min read

CTO 如何在 20 分鐘內找出慢查詢並在財務升級前修復

NeonEdge 是一個以密碼貨幣為原生的 iGaming 平台,總部位於愛沙尼亞塔林,以支援 ETH、Tron、Polygon 和 SOL 多鏈的可驗公平 Crash 遊戲為核心。平台每月約有一萬五千名活躍用戶,每週產生約 500 萬美元的 GGR。這是一個精幹、技術雄心勃勃的團隊——兩名工程師負責整個數據基礎設施——而 Priya Desai,CTO 兼數據負責人,是產品和財務遇到任何問題時第一個打電話的人。

使用產品:查詢效能分析、基礎設施監控、成本優化

20 分鐘 | 完整調查時間

3 | 從零開始識別出的問題查詢數量

12 倍 | 優化部署後的平均提速倍數


挑戰

投訴在四十八小時內從兩個不同方向同時湧入。產品團隊在 Slack 上反映玩家活動報表感覺很遲鈍——「有時候點了就等,然後就放棄了。」財務部門說得更直白:每週 GGR 對帳報表已開始在載入中途超時,CFO 只好在頁面崩潰前截圖保存半渲染的畫面。沒有錯誤代碼,沒有明顯故障——只是緩慢,已悄悄從令人煩惱跨越到真正出問題的界線。

Priya 處理這類問題的標準診斷工具並不快速。在多鏈數據棧中追蹤查詢延遲,意味著要關聯三個獨立服務的日誌、手動檢查叢集資源使用率,並重建哪個上游轉換為哪個下游報表增加了時間。順利的情況下,若日誌已提前浮現,這需要兩到三小時;糟糕的情況——慢查詢只在高負載下出現——可能拖整個下午。

結構性問題在於 NeonEdge 的數據棧是自然生長的。早期在五千 MAU 時做出的工程決策,在平台突破一萬五千後從未被重新審視。沒有人刻意決定跳過索引,或在核心報表中寫入全表掃描;這只是在團隊專注於功能交付而非審計數據訪問模式時,逐漸發生的。

「我們是一個兩人數據團隊,為一萬五千名用戶和每週五百萬美元 GGR 的基礎設施服務。我沒有奢侈的時間花一整天追一個慢查詢。我需要在二十分鐘內看到瓶頸,否則問題就等到下個 Sprint。」

— 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%
前 3 名合計 約 100 秒(合計) 58%
前 10 名合計 71%

⚠️ Gaming Mind flags:前 3 個查詢佔總查詢執行時間的 58%。分佈嚴重不均——查詢 1–3 各平均 28–41 秒,而查詢 4–10 合計平均不到 6 秒。修復前 3 個查詢,預計可在不觸及其他任何內容的情況下,將總查詢時間減少約 58%。

Gaming Mind 的第一個回應是過去七天查詢執行時間的排名排行榜。前十名最慢的查詢佔總執行時間的 71%,但分佈極不均衡——最差的三個平均每個耗時 28 到 41 秒,而第四到第十名合計平均不到六秒。Gaming Mind 標記前三名為唯一值得立即調查的對象:修復它們預計可在不觸及其他任何內容的情況下,將總查詢時間減少約 58%。Priya 在九十秒內就有了起點。


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 flags:GGR 對帳報表——正是財務投訴的那個查詢——為了回答一個只需要當週數據的問題,正在對 18 個月的交易歷史進行全表掃描。在掃描前應用日期篩選是唯一需要的修復。這是財務 CFO 超時的根本原因。

最慢的查詢是 GGR 對帳報表——正是財務投訴的那個。Gaming Mind 逐階段分解其執行計劃:一個全表掃描每次執行都會觸及交易帳本中的每一行,包括從平台上線起的歷史記錄。查詢在掃描前沒有應用日期篩選,這意味著每次需要回答只涉及當週的問題時,它都在處理近十八個月的交易歷史。Gaming Mind 將此歸類為高嚴重性訪問模式,並標記為「未篩選的歷史掃描」——追加型帳本架構中已知的效能反模式。根本原因是十八個月前的一個從未被重新審視的設計決策。


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 flags:玩家活動報表的關聯在篩選前先擴展——產生的中間結果集比必要大小大約 3 倍。顛倒關聯序列中的兩個步驟(先應用最窄的篩選)將把中間記憶體消耗減少約三分之二,並將執行時間從 31 秒降至 5 秒以下。

第二個問題查詢為產品團隊標記的玩家活動報表提供數據。Gaming Mind 識別出一個多階段關聯——它在篩選前先擴展,在按玩家群組和日期範圍縮小之前,以峰值大小處理寬中間結果集。關聯順序產生的中間表比必要大小大了近三倍。Gaming Mind 標注了結果集膨脹的確切階段,並估計顛倒關聯序列中的兩個步驟——先應用最窄的篩選——將把中間記憶體消耗減少約三分之二,並將執行時間從三十一秒降至五秒以下。


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 flags:在此查詢的每個版本中都出現的三個欄位——chain_identifier、registration_date 和 game_category——各自都有索引,但從未作為複合索引。添加一個複合索引將消除手動求交集的工作,同時加速群組報表以及平台上的另外 13 個查詢。

第三個慢查詢是玩家群組報表,每週由產品和 CRM 團隊使用。Gaming Mind 找到了一個索引覆蓋缺口:在此查詢的每個版本中一起出現的三個欄位——鏈識別符、註冊日期和遊戲類別——各自都有索引,但從未作為複合索引。每次執行都在查詢時手動解析交集,做著單個複合索引本可完全消除的工作。Gaming Mind 指出,這個欄位組合出現在平台上的十四個不同查詢中,意味著添加單個索引將同時加速群組報表和另外十三個查詢。


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 flags:每一次 CPU 和 I/O 使用率峰值都與計劃報表執行時間重合。在過去 10 天中,有 3 次 GGR 對帳和玩家活動報表並發執行,將記憶體推至 89% 以上,觸發了波及其他工作負載的隊列延遲——包括財務 CFO 的超時。這不僅僅是一個慢查詢問題。這是叢集穩定性風險。

Gaming Mind 將三個慢查詢視窗疊加到 NeonEdge 過去兩週的叢集資源熱力圖上。模式一目了然:每次 CPU 和 I/O 使用率峰值都與計劃報表執行時間重合,且叢集在前兩個查詢並發執行期間,記憶體幾乎達到容量上限。在過去十天中,有三次 GGR 對帳和玩家活動報表並發執行,將記憶體使用率推至 89% 以上,觸發了波及其他工作負載的查詢隊列延遲——包括 CFO 遭遇的財務超時。這不僅僅是慢查詢問題。這是叢集穩定性風險。


Priya:「我應該如何優先排序這三個修復?先做哪個?」

修復 查詢 預計提速 實施難度 部署風險 影響的查詢數 建議順序
添加複合索引(chain_id + reg_date + game_cat) 玩家群組報表 約 9 倍 低(< 1 小時) 非常低 14 個查詢 第 1 位——今天部署
重寫關聯順序(篩選後再擴展) 玩家活動報表 約 6 倍 中(3–4 小時) 低(在暫存環境測試) 1 個查詢 第 2 位——暫存後部署
在全表掃描前添加日期謂詞 GGR 對帳報表 約 12 倍 中(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 flags:優先部署複合索引——風險最低、實施最快、對平台 14 個查詢的正面影響最廣。GGR 關聯重寫的個別提速最高(預計 12 倍),但需要針對財務的確切報表參數進行暫存驗證。全表掃描修復必須在部署前與財務協調維護視窗。

Gaming Mind 製作了一個優先級矩陣,在四個維度上對每個修復進行評分:預計提速、實施複雜度、部署風險以及下游影響的廣度。複合索引排名第一——風險最低、部署最快,且對平台十四個受影響查詢的正面影響最廣。GGR 關聯重寫排名第二:個別提速最高,預計十二倍提升,但需要針對財務的確切報表參數進行仔細的測試,才能部署。未篩選全表掃描修復排名第三——影響也很高,但涉及對財務固定每週計劃運行的報表進行日期篩選更改,這意味著需要協調部署視窗。Gaming Mind 建議先部署索引,在暫存中測試關聯重寫,並將全表掃描修復安排在下次財務維護視窗中。


Priya:「如果我修復全部三個,預計總提速是多少?」

優化後的預計效能

查詢 修復前 修復後 提速
GGR 對帳報表 41.2 秒 3.4 秒 約 12 倍
玩家活動報表 31.0 秒 4.8 秒 約 6 倍
玩家群組報表 28.3 秒 3.1 秒 約 9 倍
平均報表生成(合計) 45.0 秒 < 4.0 秒 > 11 倍

叢集資源餘量

指標 修復前 修復後 變化
記憶體使用率(並發報表執行) 89%(上限) 約 34% -55 個百分點
每 10 天的隊列級聯事件 3 0(預計) 消除
CFO 報表超時風險 存在 無 消除

次要效益——GGR 對帳緩存

詳情 數值
修復後緩存資格 是(日期謂詞啟用預計算)
預計每月運算成本降低 約 60%
標記此效益的模組 成本優化

⚠️ Gaming Mind flags:三個修復合計預計將平均報表生成時間從 45 秒降至 4 秒以下——降幅超過 90%。峰值計劃執行期間的叢集記憶體將從 89% 降至約 34%,完全消除級聯隊列風險。GGR 對帳修復還解鎖了預計算緩存資格,預計可將該報表的每月運算支出減少約 60%。

Gaming Mind 對合併效果進行了建模。三個修復合計預計將平均報表生成時間從四十五秒降至四秒以下——降幅超過九十%。峰值計劃執行期間的叢集記憶體使用率預計從當前 89% 的上限下降至約 34%,完全消除隊列級聯風險。預測還標記了一個次要效益:隨著未篩選全表掃描問題解決,GGR 對帳報表將有資格進行預計算緩存,Gaming Mind 的成本優化模組估計這將每月減少約六十%的該報表運算支出。

「我走進去以為要在日誌檔案裡花一下午。Gaming Mind 在二十分鐘內就把三個查詢排好名次、分析完畢、並按優先順序列出修復清單。甚至告訴我按什麼順序修復。我只需要寫代碼。」

— Priya Desai


成果

從零開始,20 分鐘內完成調查

Priya 沒有預建的查詢效能儀表板,也沒有可追蹤的開放事件。Gaming Mind 提取了遙測數據,對違規者進行了排名,並在一次對話中生成了按部署順序排列的修復清單。零個日誌檔案打開,零個支援工單提交,零個工程師從其他工作中抽調。

三個根本原因,跨越三種不同問題類型

每個慢查詢都有結構上不同的原因——未篩選的歷史掃描、次優的關聯順序以及缺失的複合索引。Gaming Mind 診斷了全部三個問題,並用 Priya 可以直接向工程團隊傳達的通俗語言解釋了每一個,無需翻譯。調查浮現了幾個月來一直在積累的問題,而不僅僅是過去四十八小時內報告的症狀。

修復部署後平均提速 12 倍

複合索引當天下午就上線了。關聯重寫在當天結束前通過了暫存測試,次日早上部署。全表掃描修復與財務協調後,在下次維護視窗中部署。三個更改全部完成後,平均報表生成時間從四十五秒降至三秒四十二秒——根據平台自身遙測測量,提升了十二倍。

叢集穩定性風險在演變成事件前被消除

在並發報表執行期間,記憶體使用率上限——一直悄悄逼近 89%——在修復後降至 34%。過去十天發生的三次級聯事件,是叢集在高負載下接近故障的早期預警信號。Gaming Mind 從資源熱力圖分析中浮現了這個風險;如果沒有它,下一個事件很可能是高流量週末時段的全面報表中斷。

對帳報表的每月運算成本預計降低 60%

成本優化模組標記了 GGR 對帳報表修復後的預計算緩存資格。Priya 的團隊在初始修復後兩週實施了緩存層,次月該報表工作負載的基礎設施費用為之前基準的三十八%——略好於預期。

「叢集距離真正中斷只差三個糟糕的週日,而我們不知道。效能調查找到了慢查詢,但資源熱力圖找到了穩定性風險。那才是真正讓我害怕的部分——也是我最慶幸在它找到我們之前,我們先找到了它。」

— Priya Desai,CTO,NeonEdge

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

Get a Demo