评估标准:若 DAU / 目标用户数 < 30% 且持续 3 个月,视为活跃度低。本方案仅查询 DAU 原始数据,百分比需结合目标用户数另行计算。
| 数据库表 | 实体类 | 说明 |
|---|---|---|
| base_account_logs | BaseAccountLogs | 用户每次登录写入一条记录,含 user_id 和 login_time |
| 字段名 | 类型 | 说明 |
|---|---|---|
| user_id | bigint | 用户ID |
| login_time | datetime | 登录时间 |
| login_ip | varchar | 登录IP |
| account_type | varchar | 登录方式 (password/mobile/weixin等) |
-- 每日活跃用户数(最近90天) SELECT DATE(login_time) AS stat_date, COUNT(DISTINCT user_id) AS dau FROM base_account_logs WHERE login_time >= DATE_SUB(CURDATE(), INTERVAL 90 DAY) GROUP BY DATE(login_time) ORDER BY stat_date DESC;
-- 按月汇总平均DAU(最近6个月) SELECT DATE_FORMAT(stat_date, '%Y-%m') AS stat_month, ROUND(AVG(dau)) AS avg_dau, MIN(dau) AS min_dau, MAX(dau) AS max_dau FROM ( SELECT DATE(login_time) AS stat_date, COUNT(DISTINCT user_id) AS dau FROM base_account_logs WHERE login_time >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) GROUP BY DATE(login_time) ) daily GROUP BY DATE_FORMAT(stat_date, '%Y-%m') ORDER BY stat_month DESC;
评估标准:核心功能周均使用次数低于预期,视为用户粘性不足。仅统计"智能查询"功能。
| 数据库表 | 实体类 | 说明 |
|---|---|---|
| hg_search_log | HgSearchLog | 每次搜索操作写入一条记录,search_type 区分子功能类型 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| search_log_id | bigint | 主键 |
| user_id | bigint | 用户ID |
| search_time | datetime | 搜索时间 |
| search_type | int | 1=浏览法规 2=标签搜索 3=文本搜索 4=智能问答 |
| search_content | varchar | 搜索内容 |
| user_name | varchar | 用户名 |
-- 智能查询 每周使用频次(最近90天) SELECT DATE_FORMAT(search_time, '%x-W%v') AS stat_week, MIN(DATE(search_time)) AS week_start, MAX(DATE(search_time)) AS week_end, COUNT(*) AS weekly_usage, COUNT(DISTINCT user_id) AS weekly_users, SUM(CASE WHEN search_type = 3 THEN 1 ELSE 0 END) AS text_search_cnt, SUM(CASE WHEN search_type = 4 THEN 1 ELSE 0 END) AS ai_qa_cnt, SUM(CASE WHEN search_type = 2 THEN 1 ELSE 0 END) AS label_search_cnt, SUM(CASE WHEN search_type = 1 THEN 1 ELSE 0 END) AS reg_view_cnt FROM hg_search_log WHERE search_time >= DATE_SUB(CURDATE(), INTERVAL 90 DAY) GROUP BY DATE_FORMAT(search_time, '%x-W%v') ORDER BY stat_week DESC;
-- 智能查询 周均使用次数 SELECT ROUND(AVG(weekly_usage), 1) AS avg_weekly_usage, ROUND(AVG(weekly_users), 1) AS avg_weekly_users FROM ( SELECT DATE_FORMAT(search_time, '%x-W%v') AS stat_week, COUNT(*) AS weekly_usage, COUNT(DISTINCT user_id) AS weekly_users FROM hg_search_log WHERE search_time >= DATE_SUB(CURDATE(), INTERVAL 90 DAY) GROUP BY DATE_FORMAT(search_time, '%x-W%v') ) weekly;
%x-W%v 为 ISO 年-周格式(如 2026-W09),可避免跨年周数错乱。search_type 枚举:1=浏览法规详情、2=标签搜索、3=文本搜索、4=智能问答,四种类型均属于"智能查询"功能范畴。
评估标准:核心页面(如登录、审批列表)平均加载时间 > 3秒,视为用户体感差。
hg_oper_log 操作日志表仅记录了 oper_time(操作发生时间),但未记录接口响应耗时。因此无法直接通过 SQL 查询获取页面加载时长,需要通过以下替代方案采集数据。
$request_time 或 $upstream_response_time 可反映服务端响应时长。无需改代码,可立即执行。
LogAspect 中增加接口耗时计算,hg_oper_log 表新增 cost_time 字段。需少量代码改动,改动后可 SQL 统计。
Performance API 数据并上报后端。最完整的方案,可获取真实用户端到端加载时长。
# 前提:Nginx log_format 中已包含 $request_time # 示例 log_format: # '$remote_addr - $time_local "$request" $status $request_time' # 统计核心页面接口平均响应时间(秒) awk ' $7 ~ /\/(api\/(search|reg|login|traffic)|log\/receive)/ { sum += $NF; count++ } END { if (count > 0) printf "平均响应时间: %.3f秒 (共%d次请求)\n", sum/count, count } ' /var/log/nginx/access.log # 按接口分组统计 P50 / P95 / P99 awk ' $7 ~ /\/(api\/(search|reg|login))/ { api = $7; gsub(/\?.*/, "", api); times[api][++n[api]] = $NF } END { for (api in n) { asort(times[api]); cnt = n[api]; p50 = times[api][int(cnt*0.5)]; p95 = times[api][int(cnt*0.95)]; p99 = times[api][int(cnt*0.99)]; printf "%-40s P50=%.3fs P95=%.3fs P99=%.3fs (n=%d)\n", api, p50, p95, p99, cnt } } ' /var/log/nginx/access.log
-- 前提:hg_oper_log 已新增 cost_time 字段(单位:毫秒) -- ALTER TABLE hg_oper_log ADD COLUMN cost_time BIGINT DEFAULT NULL COMMENT '接口耗时(ms)'; -- 核心接口平均响应时间(按URL分组) SELECT oper_url AS api_path, COUNT(*) AS request_cnt, ROUND(AVG(cost_time)) AS avg_ms, ROUND(MAX(cost_time)) AS max_ms, ROUND( PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY cost_time) ) AS p95_ms FROM hg_oper_log WHERE oper_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND cost_time IS NOT NULL GROUP BY oper_url HAVING avg_ms > 3000 ORDER BY avg_ms DESC;
PERCENTILE_CONT,可用子查询模拟 P95:SELECT cost_time FROM hg_oper_log ORDER BY cost_time LIMIT 1 OFFSET FLOOR(COUNT(*) * 0.95)
| 指标 | 数据库表 | 可直接查询 | 统计维度 | 备注 |
|---|---|---|---|---|
| DAU | base_account_logs |
可以 | 按日 / 按月 | COUNT(DISTINCT user_id) GROUP BY DATE(login_time) |
| 智能查询使用频次 | hg_search_log |
可以 | 按周 | search_type 1~4 均属智能查询范畴,可分类型细查 |
| 页面加载时长 | 无 | 不可 | — | 推荐通过 Nginx access log 分析,或扩展 hg_oper_log 增加 cost_time 字段 |