
统计用户注册数量,核心是按时间维度(如日、周、月)对用户表中的注册时间字段进行分组计数。MySQL 本身不直接生成报表,但可通过 SQL 查询 + 外部工具(如 php、python、BI 工具或定时任务)完成数据提取与展示。
基础统计:按天/月查注册人数
假设用户表为 users,注册时间字段为 created_at(类型为 dateTIME 或 timestamp):
- 按天统计(最近7天):
select DATE(created_at) AS reg_date, count(*) AS reg_count
FROM users
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY DATE(created_at)
ORDER BY reg_date; - 按月统计(最近12个月):
SELECT DATE_FORMAT(created_at, ‘%Y-%m’) AS reg_month, COUNT(*) AS reg_count
FROM users
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 12 MONTH)
GROUP BY reg_month
ORDER BY reg_month;
补全缺失日期(避免“没注册就不显示”)
原始 GROUP BY 会跳过零注册的日期,影响趋势图。需用日期生成辅助表或递归 CTE 补齐(MySQL 8.0+ 支持):
- 生成连续日期(示例:最近30天):
WITH RECURSIVE date_range AS (
SELECT CURDATE() – INTERVAL 29 DAY AS dt
union ALL
SELECT dt + INTERVAL 1 DAY FROM date_range WHERE dt )
SELECT d.dt AS reg_date, COALESCE(u.cnt, 0) AS reg_count
FROM date_range d
LEFT JOIN (
SELECT DATE(created_at) AS reg_date, COUNT(*) AS cnt
FROM users
WHERE created_at >= CURDATE() – INTERVAL 29 DAY
GROUP BY DATE(created_at)
) u ON d.dt = u.reg_date
ORDER BY d.dt;
提升查询效率的关键点
注册量大时,慢查询会拖垮报表生成速度:
- 在 created_at 字段上建立普通索引:
CREATE INDEX idx_created_at ON users(created_at); - 若只查近一年数据,可考虑按月分区(如 RANGE 分区),但需评估维护成本;
- 避免在 WHERE 或 GROUP BY 中对 created_at 做函数运算(如 YEAR(created_at)),否则无法走索引 —— 应改用范围查询 + DATE() 或 DATE_FORMAT() 配合索引。
接入报表系统的小技巧
纯 SQL 不够直观,建议结合轻量方案落地:
- 用 MySQL 定时事件 + 汇总表:每天凌晨把前一日注册数写入 stat_user_daily 表,报表直接查该表;
- 用 Python(pandas + pymysql)拉取数据,生成 excel 或对接 echarts 渲染折线图;
- 用 Metabase / grafana 等开源 BI 工具直连 MySQL,配置可视化看板,支持下钻和导出。
不复杂但容易忽略