CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
数据存储

【数据存储】大表瘦身:日志表的滚动清理方案

2026-09-21 13:46 作者:996 技术组 0 阅读 数据存储

实战应用:用在哪里

行为日志表只进不出:开服一年攒到 1.2 亿行,索引深了、备份慢了、查询热表也跟着遭殃。滚动清理让日志表保持恒定的体量——90 天内的热数据留在主表,更早的按天归档后删除,主表的 B 树高度与缓存命中率回归健康。

滚动归档的调度

lua

---全局定时器 41 号:每 30 分钟执行一轮
setontimerex(41, 1800)
function LogRoll.tick()
    local cutoff = os.date("%Y%m%d", os.time() - 90 * 86400)
    local oldest = LogRoll.oldestDay()
    if oldest >= cutoff then return end
    LogRoll.archiveDay(oldest)
end

function LogRoll.archiveDay(day)
    DB.trans(function()
        DB.exec("INSERT INTO logs_archive SELECT * FROM logs WHERE day = ?", day)
        DB.exec("DELETE FROM logs WHERE day = ?", day)
    end)
end

清理按天分片:90 天前的最老一天先整表插入归档库再从主表删除,事务保证两边一致,中断后该天重做。每天一轮的节奏让单日删除量可控,避免一次性删几千万行导致 undo 日志暴涨。按 day 列的分片删除走索引边界扫描,比按时间戳的范围删除快一个量级。

删除的限流与校验

lua

---归档行数与删除行数的对账
function LogRoll.verify(day)
    local archived = DB.scalar("SELECT COUNT(*) FROM logs_archive WHERE day = ?", day)
    local remained = DB.scalar("SELECT COUNT(*) FROM logs WHERE day = ?", day)
    if remained > 0 or archived == 0 then
        LogRoll.alert("归档对账失败: " .. day)
        return false
    end
    LogRoll.markDone(day)
    return true
end

每轮归档后对账:归档行数非零且主表残留为零才算该天完成,完成标志防重复搬。主表的体量由此稳定在 90 天的窗口内,1.2 亿行瘦身后回到 3000 万行,磁盘占用从 62% 降到 28%。查询的受益立竿见影:行为回放查询从 800 毫秒降到 90 毫秒,攻城战期间的行为审计不再拖累在线业务。

验证与监控

主表行数的日终快照监控,行数反弹说明某天的归档失败重试;归档任务的耗时监控,单天归档超过 10 分钟即限流降速。

踩坑记录

删除曾经不按天分片,一条范围 DELETE 跑了 4 小时还锁着热区间,在线查询集体超时,按天分片加低峰调度后无感。归档表的 day 列曾经没建索引,对账查询全表扫描拖垮归档库,索引补齐后对账秒回。归档成功标志曾经先写后提交,事务回滚后标志残留,该天被跳过永不归档,标志写入移进事务内。

上线要点

保留窗口按日志类型分档:交易类 730 天、行为类 90 天、坐标类 30 天,各自的窗口进配置。归档库与主库分实例,归档库只读不承接在线查询。清理任务与备份任务错峰:归档完成后再触发该天的备份切片,两件事叠加是磁盘 IO 的灾难。

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

最新技术文章 · 实战干货

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

玩法策划远征编制

【玩法策划】跨服远征编制:借鉴MMO远征的分层推进方案

实战应用:用在哪里 跨服远征分先锋、主力、后勤三队独立推进,三线全通合围BOSS。不同战力成员都有参与感。 策划要点与配置 …

2026-09-22 21:15 996 技术组 · 0 阅读
案例复盘副本难度

【案例复盘】副本超时惩罚倍率复盘

实战应用:用在哪里 副本限时挑战加入超时血量惩罚:超时后BOSS攻击递增。上线后BOSS攻击叠到十倍秒杀全队。 事故还原与补…

2026-09-22 21:15 996 技术组 · 0 阅读
界面UI神兽特效

【界面UI】混沌麒麟入场特效:神兽召唤的三段演出设计

实战应用:用在哪里 混沌麒麟召唤是全服高光时刻:暗幕聚合、裂缝展开、麒麟着陆三段演出各1.3秒。 三段式入场演出编排 围观镜…

2026-09-22 21:15 996 技术组 · 0 阅读
前端接口任务回看

【前端接口】任务对话历史回看:对话记录的界面查询实现

实战应用:用在哪里 任务对话一闪而过玩家想回顾。回看接口把对话按节点存档,面板翻阅全部对话记录。 对话存档与查询渲染 当前章…

2026-09-22 21:15 996 技术组 · 0 阅读
引擎触发懒加载地图

【引擎触发】挂机地图按需激活:地图实例懒加载设计

实战应用:用在哪里 服务器承载六十张地图,空闲地图白耗资源。按需激活,末人离开后六十秒休眠。 激活与休眠触发 休眠回收 验证…

2026-09-22 21:15 996 技术组 · 0 阅读
Lua实战坐骑洗炼

【Lua实战】坐骑资质洗炼与锁定:资质系统的Lua实现

实战应用:用在哪里 坐骑资质洗炼随机重滚五条属性,锁定满意的条目不再重滚,锁定越多消耗越大。 洗炼与锁定 锁定消耗递增 验证…

2026-09-22 21:15 996 技术组 · 0 阅读