业务背景:
由于用户签到接口上线后, 存在新老接口并存! 老用户的签到数据存在在 user_sign_record表,新接口签到数据保存在 sign_user_sign表+user_sign_record表。故需要基于user_sign_record表修正sign_user_sign表中连续签到天数字段值~
处理过程
表结构如下:
表中已存在的索引:
待执行的SQL语句如下
SELECT id, account_id, sign_time, is_delete FROM user_sign_record
WHERE
account_id = 2076810915902193782
AND sign_time >= '2023-01-13 00:00:00'
AND sign_time <= '2023-04-23 23:59:59'
AND is_delete = 0
ORDER BY
sign_time DESC
由于线上数据量是1471w,时间过滤效果不明显,account_id存在隐式样类型转换,无法使用
修复线上6k+用户,根据线上执行日志耗时预估,6000 *18 秒/3600 秒 =(18*10/6)小时=30小时
效率太低!修正代码逻辑 ,传参字段改为 String类型的account_id,并创建 account_id和sign_time的联合索引!
新的索引结构如下:
新查询语句
explain SELECT id, account_id, sign_time, is_delete FROM user_sign_record
WHERE
account_id = '2076810915902193782'
AND sign_time >= '2023-01-13 00:00:00'
AND sign_time <= '2023-04-23 23:59:59'
AND is_delete = 0
ORDER BY
sign_time DESC
最终,整个修复过程不到2分钟执行完毕! 效率提升显著
message:任务号[AAB976E313064889BCBCE300F5F5BC3F],本轮签到数据修复总耗时 82947ms,总人数6338