关于SQL优化的问题? 400 报错
现在有一个需求,求用户流失的,现在数据库表字段是
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 都是大表
先写个sql过滤下 login_time小于某个时间段的数据 要加索引 然后再写between查询结果
######回复 @叶峰2017 : 你现在的效率是多少 有试下先查询一次 再用结果集去查嘛######加了索引了,但是还是很慢,现在的数据量在,500W.我都要用脚本来统计好后查到一个缓存表里的######1、加索引。
2、表如果很大的话,最好还是另外单独建一张统计表,定时统计。
######对的,我现在就是用脚本在凌晨跑完,然后早上他们用的话,读的是缓存表######可以尝试加一个字段,记录用户今天登陆后已经连续登陆了多少天。比如今天登陆了,昨天也登陆了那这个天数就是昨天的连续天数+1 否则就是重新变为1
这样统计连续两天登陆的就是连续登陆的次数>1就好了
######开发那边不容许修改东西啊,很烦#######clickhouse# 了解一下?神速,mysql一键转入,专用函数,你会喜欢的。######in 太慢了,不妨分成两次查询,最后在内存中计算,会好些
######in里的结果级大概在4/5万左右,如果放内存用for循环查询,那查出来也要好久了版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。