记录用户操作日志,核心是“留痕、可查、可控”,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除非确认无误
不复杂但容易忽略的是:日志写入尽量异步(如通过消息队列中转),避免阻塞主业务流程;同时确保日志内容脱敏,手机号、身份证号等敏感字段入库前必须加密或掩码处理。
