本文正在参加「技术专题19期 漫谈数据库技术」活动 这几日在项目工作当中遇到了一个需求,基于日志时间的数据查询,有些难搞,琢磨了半天,写下了这篇想法,也请大家指点。
场景:
这样一个需求,需要记录进入店铺浏览痕迹,不需要实时,每小时统计一次,然后进行数据分析,由于这个项目本身的规模不是很大,并且感觉ES太重了,所以决定先使用MySQL试试,如果有问题再进行调整。
思考:
不想动之前写好的代码(菜鸡思路:代码与我必须有一个可以跑),所以大概想了这样一个思路:
1、因为不是实时要求的,所以个人感觉最好不要用户访问一个商品的详情就去数据库里插入一条(这个想想有点恐怖),在nginx上进行配置埋点,这个在之前的博客有说过,思路类似。
2、然后,每小时统计一次,将数据写入到mysql表当中,当然可以在配置nginx日志的时候选择按照小时切分,这样统计的时候就免去了大量使用时间来过滤日志的操作。
这样完美的避开了前任的代码逻辑,访问商品的时候只是在Nginx日志里面多形成了一条记录,统计日志是采用定时脚本实现的,所以都不会到前任留下的视图函数里操作,设定的数据结构类似下面(自己设计的模拟表):
| id | store_name | goods_name | goods_type | browse_time | user_name |
|---|---|---|---|---|---|
| 1 | 老边超市 | 小锤锤 | 五金 | 2012-02-03 20:00:00 | 老王 |
| 2 | 老边超市 | 小饼干 | 视频 | 2012-02-03 20:00:00 | 老李 |
| ... | ... | ... | ... | ... | ... |
当然基于这个数据库查询还是做了一些其他策略,比如构建视图表等等,但是今天先不聊这些,先聊聊基于这个逻辑做的查询上的一些思考。
实现:
想要实现查询,首先理解业务,所以我们先大概的设定几个业务场景
1、查询今天浏览情况。
2、查询本月不同类型商品每天的浏览情况。
当然工作当中不止这三种需求,我们大致安装这三个业务来分析一下查询的实现(这里我使用Python模拟插入了10000条数据),
期初觉得不是很难,分析上面的查询后感觉几个点有点棘手:
1、时间给定的是一个字符串格式的 YYYY-mm-dd HH:MM:SS,但是需求上需要统计按照小时(天每小时的变化情况),天(周每天的情况)去统计:
这个点想到的有两个办法:
1)使用字段部分进行分组:
这里使用了left函数,对时间进行了左偏移,
select left(browse_time,13) as hour_time,count(*) as number from browse_log where left(browse_time,10) = "2022-01-01" group by hour_time ORDER BY hour_time;
2)使用时间函数date_format:
date_format可以对时间进行格式化,
select date_format(browse_time,"%Y-%m-%d %H:00:00") as hour_time,count(*) as number from browse_log where browse_time like "2022-01-01%" group by hour_time ORDER BY hour_time;
上面的两种方法只适合固定格式的分组字段,比如像时间这样的,但是在日志分析需求上也是够用了。
2、对多字段进行分组统计:
统计本月每天的销售情况
select left(browse_time,10) as hour_time,count(*) as number from browse_log where left(browse_time,7) = "2022-01" group by hour_time;
统计本月每天每种商品的销售情况
这里需要使用两个字段进行分组
select left(browse_time,10) as hour_time,goods_type,count(*) as number from browse_log where left(browse_time,7) = "2022-01" group by hour_time,goods_type;
当然,大家觉得还有什么好的方法,感谢留言指点。
本文正在参加「技术专题19期 漫谈数据库技术」活动