问下这个 sql 性能能不能达到 2s 查出结果

2021-12-24 17:36:37 +08:00
 TomVista

表结构 user_id/用户 ID date/签到日期 isign/当日是否签到

使用场景:筛选最大的连续签到天数为 xx 天的签到记录, 只在管理后台查询,没有任何优化,百万级别能不能做到 2s 之内啊?

需要分页查询

select * from 

(SELECT t3.user_id,max(t3.date3) as sign FROM
(SELECT t2.user_id,count(t2.date2) date3 FROM
(SELECT t1.user_id,DATE_SUB(t1.date,INTERVAL t1.ranking day) as date2 FROM
(SELECT *,
row_number() over (PARTITION by user_id order by date) as ranking 
from sign
where sign_in=1)t1/*① 筛选出每个 user 的签到日期,并排序*/
)t2/*② 签到日期减去签到排名,如果是连续签到,则得到的日期相同*/
GROUP BY t2.user_id,t2.date2)t3 /*③ 按照 user_id 分组,分别求出各连续签到的时间*/
GROUP BY t3.user_id;)t4 where t4.sign=xx /*④ 求出最大值,并筛选*/

这个 sql 修改自知乎 的问题 2,

706 次点击
所在节点    问与答
1 条回复
LLaMA2
2021-12-25 10:48:59 +08:00
不擅长 sql
我发表下个人愚见
每日 0 点使用您的 sql 查处前一天的情况,缓存好,记为数据 1
后台每次刷新时,先查询最后一条签到记录,缓存下该条记录的插入时间,记为数据 2
然后只查询今天的签到记录,并把记录中涉及的人的签到时长在数据 1 的基础上追加 1 天,记为数据 4
输入到前台
如果之后每次刷新是,如果最后一条签到记录没有变化,则直接输入,否则继续在数据 4 的基础上追加,并修改数据 2

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/824283

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX