应按日志类型分层设计2–3张表(如user_action_log、business_op_log、data_audit_log),每表含id、user_id、ip、ua、created_at、status、trace_id等基础字段,业务字段用JSON或单独ID承载,注重索引优化、分区归档与异步脱敏写入。
记录用户操作日志,核心是“留痕、可查、可控”,MySQL 表设计需兼顾写入性能、查询效率和业务扩展性。不建议直接用通用日志表硬套所有操作,应按日志类型分层设计,同时避免过度冗余或字段缺失。
用户操作日志不是只有一张表能解决的。常见类型包括:
不同日志对字段要求差异大,混在一起会导致查询慢、维护难。建议按类型建 2–3 张表,例如:user_action_log、business_op_log、data_audit_log。
每张日志表都应包含以下最小必要字段,确保可追溯性:
CHAR(45),支持 IPv6;可额外加 ip_region 字段存解析后的归属地(减少实时查询压力)避免在日志表里堆砌大量业务字段。推荐方式:
JSON 类型,存操作参数、旧值/新值、表单数据等。查询时可用 JSON_EXTRACT 提取,写入自由,不改表结构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)建联合索引PARTITION BY RANGE (TO_DAYS(created_at))),方便归档和删除历史数据INSERT ... SELECT + DELETE 或 pt-archiver 工具,别直接 DROP PARTITION 除非确认无误不复杂但容易忽略的是:日志写入尽量异步(如通过消息队列中转),避免阻塞主业务流程;同时确保日志内容脱敏,手机号、身份证号等敏感字段入库前必须加密或掩码处理。