TomVista
V2EX  ›  问与答

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

  •  
  •   TomVista · Dec 24, 2021 · 1038 views
    This topic created in 1601 days ago, the information mentioned may be changed or developed.

    表结构 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  
       Dec 25, 2021
    不擅长 sql
    我发表下个人愚见
    每日 0 点使用您的 sql 查处前一天的情况,缓存好,记为数据 1
    后台每次刷新时,先查询最后一条签到记录,缓存下该条记录的插入时间,记为数据 2
    然后只查询今天的签到记录,并把记录中涉及的人的签到时长在数据 1 的基础上追加 1 天,记为数据 4
    输入到前台
    如果之后每次刷新是,如果最后一条签到记录没有变化,则直接输入,否则继续在数据 4 的基础上追加,并修改数据 2
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1061 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 18:42 · PVG 02:42 · LAX 11:42 · JFK 14:42
    ♥ Do have faith in what you're doing.