关于SQL优化的问题

叶峰2017 发布于 09/14 14:44
阅读 317
收藏 0

现在有一个需求,求用户流失的,现在数据库表字段是

login_time是登录时间.字段是时间戳类型.要求出1日流失.2日流失,三日流失和周流失人数.

流失计算公式:

1日:7月6日的1日流失用户数为7月6日登陆的用户在7月7日没有登陆的用户数            
2日:7月6日的1日流失用户数为7月6日登陆的用户为7月7-8日没有登陆的用户数            
3日:7月6日的3日流失用户数为7月6日登陆的用户为7月7、8、9日没有登陆的用户数            
周流失:7月6日的周流失数=6月30日-7月6日登陆过的用户在7月7日-7月13日没有登陆的用户数            

 

我现在的思路是,比如算1日流失:先算出在7/6号登录的人数,在算出7/6号登录的人并且7/7日也登录的人数.两个相减

问题在算7/6号登录的人并且在7/7日也登录的这个SQL太慢了.有没有大神设计一下!!

本人的sql  :select count(distinct wx_openid) from loginlog where login_time between '7/7号开始时间戳'  and '7/7号结束时间戳' and wx_openid in(select distinct wx_openid from loginlog where login_time between '7/6号开始时间戳'  and '7/6号结束时间戳' )  limit 1;

注意loginlog 都是大表

加载中
0
赵陵
赵陵

先写个sql过滤下  login_time小于某个时间段的数据 要加索引  然后再写between查询结果

赵陵
赵陵
回复 @叶峰2017 : 你现在的效率是多少 有试下先查询一次 再用结果集去查嘛
叶峰2017
叶峰2017
加了索引了,但是还是很慢,现在的数据量在,500W.我都要用脚本来统计好后查到一个缓存表里的
0
DeMoNHaDeS
DeMoNHaDeS

1、加索引。

2、表如果很大的话,最好还是另外单独建一张统计表,定时统计。

叶峰2017
叶峰2017
对的,我现在就是用脚本在凌晨跑完,然后早上他们用的话,读的是缓存表
0
Bearox
Bearox

可以尝试加一个字段,记录用户今天登陆后已经连续登陆了多少天。比如今天登陆了,昨天也登陆了那这个天数就是昨天的连续天数+1 否则就是重新变为1

这样统计连续两天登陆的就是连续登陆的次数>1就好了

叶峰2017
叶峰2017
开发那边不容许修改东西啊,很烦
0
袁国涛
袁国涛
#clickhouse# 了解一下?神速,mysql一键转入,专用函数,你会喜欢的。
0
活灬在当灬下
活灬在当灬下

in 太慢了,不妨分成两次查询,最后在内存中计算,会好些

叶峰2017
叶峰2017
in里的结果级大概在4/5万左右,如果放内存用for循环查询,那查出来也要好久了
返回顶部
顶部