V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
TomVista
V2EX  ›  问与答

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

  •  
  •   TomVista · 2021-12-24 17:36:37 +08:00 · 679 次点击
    这是一个创建于 1001 天前的主题,其中的信息可能已经有所发展或是发生改变。

    表结构 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,

    LLaMA2
        1
    LLaMA2  
       2021-12-25 10:48:59 +08:00
    不擅长 sql
    我发表下个人愚见
    每日 0 点使用您的 sql 查处前一天的情况,缓存好,记为数据 1
    后台每次刷新时,先查询最后一条签到记录,缓存下该条记录的插入时间,记为数据 2
    然后只查询今天的签到记录,并把记录中涉及的人的签到时长在数据 1 的基础上追加 1 天,记为数据 4
    输入到前台
    如果之后每次刷新是,如果最后一条签到记录没有变化,则直接输入,否则继续在数据 4 的基础上追加,并修改数据 2
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2714 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:51 · PVG 13:51 · LAX 22:51 · JFK 01:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.