应按日志类型分层设计2–3张表(如user_action_log、business_op_log、data_audit_log),每表含id、user_id、ip、ua、created_at、status、trace_id等基础字段,业务字段用JSON或单独ID承载,注重索引优化、分区归档与异步脱敏写入。

记录用户操作日志,核心是“留痕、可查、可控”,MySQL 表设计需兼顾写入性能、查询效率和业务扩展性。不建议直接用通用日志表硬套所有操作,应按日志类型分层设计,同时避免过度冗余或字段缺失。
明确日志类型与粒度
用户操作日志不是只有一张表能解决的。常见类型包括:
- 行为日志:如登录、登出、按钮点击、页面访问(适合分析用户路径)
- 业务操作日志:如订单创建、商品下架、权限变更(需关联具体业务单据 ID)
- 数据变更日志(审计日志):记录某条记录被谁、何时、从什么值改成了什么值(适合敏感数据追踪)
不同日志对字段要求差异大,混在一起会导致查询慢、维护难。建议按类型建 2–3 张表,例如:user_action_log、business_op_log、data_audit_log。
基础字段设计要点
每张日志表都应包含以下最小必要字段,确保可追溯性:
- id:BIGINT 自增或 UUID(高并发下推荐雪花 ID 或数据库代理生成)
- user_id:操作人标识(非用户名,用数字 ID 或唯一编码,便于关联用户表)
-
ip:VARCHAR(45),支持 IPv6;可额外加
ip_region字段存解析后的归属地(减少实时查询压力) - ua:TEXT 或 VARCHAR(500),存客户端 User-Agent,用于识别设备/浏览器类型
- created_at:DATETIME(3) 或 TIMESTAMP(3),带毫秒精度,设为默认 CURRENT_TIMESTAMP(3)
- status:TINYINT,标记操作是否成功(如 1=成功,0=失败,-1=异常中止)
- trace_id:VARCHAR(32),用于链路追踪(尤其微服务场景),把一次前端请求的所有日志串起来
业务相关字段灵活处理
避免在日志表里堆砌大量业务字段。推荐方式:
-
用 JSON 字段承载动态内容:如 MySQL 5.7+ 支持
JSON类型,存操作参数、旧值/新值、表单数据等。查询时可用JSON_EXTRACT提取,写入自由,不改表结构 -
关键业务 ID 单独建字段:如
order_id、product_id、role_id,便于快速 JOIN 或条件过滤 -
操作类型用枚举值(非字符串):如
action_type TINYINT,配合字典表或代码常量管理(1=login, 2=submit_order, 3=delete_user…),比 VARCHAR 更省空间、查得快
性能与维护注意事项
日志数据增长极快,设计时就要考虑长期运行:
- 主键务必是
id,且created_at加普通索引(用于按时间范围查);高频查询组合(如user_id + created_at)建联合索引 - 避免在日志表上建太多索引,写入会明显变慢;不常用的字段(如完整 UA)不要建索引
- 设置自动分区(如按月
PARTITION BY RANGE (TO_DAYS(created_at))),方便归档和删除历史数据 - 定期归档(如保留最近 180 天),用
INSERT ... SELECT+DELETE或 pt-archiver 工具,别直接DROP PARTITION除非确认无误
不复杂但容易忽略的是:日志写入尽量异步(如通过消息队列中转),避免阻塞主业务流程;同时确保日志内容脱敏,手机号、身份证号等敏感字段入库前必须加密或掩码处理。










