WEEK 07

大促备战:优化实战与工程化

大促进入倒计时。技术负责人把「慢查询清单」「后台深分页超时」「历史数据归档」「秒杀防超卖」四座大山压过来--正是从初级到中级的分界线。
目标:从「能写对」到「能写好」,具备工程判断力--这是中级岗和初级岗的分界。
0 / 7 天
剧情 大促前第一件事:建立慢查询的发现与排查机制。
练 · 50 min
  1. 把慢日志阈值设为 200ms 并重载配置
  2. 故意跑几条慢查询,从日志里捞出来
  3. 开启 auto_explain,看它记录的计划
  4. 画出属于你自己的排查流程图(一页纸)
  5. 写下「优化前必须先确认的 3 个问题」
过关有一张能对着面试官讲的排查流程图。
专注视图 ->
剧情 运营后台的订单列表翻到第 5000 页直接超时。你治好了自己的 OFFSET 恐惧症。
练 · 65 min
  1. OFFSET 0 / 10000 / 500000 各跑一次,记录耗时曲线
  2. 把同一分页改写成 keyset 分页(WHERE id < :last_id ORDER BY id DESC LIMIT 20)
  3. 用延迟关联优化:先取 id 再回表取详情
  4. 用 pg_class.reltuples 做近似总数,对比精确 count 的耗时
  5. 做一张三种分页方案的对比表(耗时、能否跳页、适用场景)
过关能写出 keyset 分页 SQL,并主动说出它的限制(不能随机跳页)。
专注视图 ->
剧情 两年攒下的订单里 90% 是不会再查的历史数据。你把 orders 按月分区,最老的分区直接归档下线。
练 · 60 min
  1. 把 orders 按月做 RANGE 分区,迁移数据
  2. 用 EXPLAIN 验证带时间条件的查询只扫了一个分区
  3. 用 CONCURRENTLY 在大表上建索引,另开窗口验证写入不被阻塞
  4. 写一个每次更新 1 万行、循环提交的批量更新脚本
  5. 把最老的一个分区 DETACH 出来归档
过关能说出分区的两个好处和两个代价(如跨分区查询变慢、分区键不能随便改)。
专注视图 ->
剧情 老板天天开的后台仪表盘每次都实时算全量报表,把库拖慢了。你用物化视图提速,顺手给运营开了只读账号。
练 · 65 min
  1. 把 D13 的月报查询建成普通视图
  2. 改成物化视图,对比两者查询耗时
  3. 加唯一索引后用 CONCURRENTLY 刷新,验证刷新期间可读
  4. 建一个只读角色,授予部分表的 SELECT 权限并测试越权访问
  5. 给 orders 加一条 RLS 策略,让「用户」只能看自己的订单
过关能说清物化视图的适用场景,以及它带来的数据延迟问题怎么权衡。
专注视图 ->
剧情 大促前的代码评审,你把这一年里见过的反模式整理成清单,替后端把了关。
练 · 50 min
  1. 写出 N+1 的具体现象,并给出 JOIN 或批量查询的改法
  2. 实测三种 count 方案(精确 / reltuples 估算 / 计数表)的耗时
  3. 找出自己这个库里可能存在的 EAV 或软删除膨胀
  4. IN 列表塞 1 万个 id,观察计划与耗时,改成 VALUES join 或临时表
  5. 整理成 antipatterns.md,每条含「为什么坏 + 怎么改」
过关反模式清单至少 8 条,每条都能说出改法。
专注视图 ->
剧情 大促压测结果:1000 个并发抢 100 件库存,超卖 37 件。你要用三种武器把超卖清零。
练 · 60 min
  1. 用唯一索引 + ON CONFLICT DO NOTHING 实现幂等下单
  2. 用版本号乐观锁扣库存,模拟冲突后重试
  3. 用 FOR UPDATE 悲观锁扣库存
  4. 用原子条件更新扣库存,验证不会扣成负数
  5. 用 pgbench 或多个会话并发压测,对比三种方案的成功率与耗时
过关能讲清三种防超卖方案各自的适用场景和代价。
专注视图 ->
剧情 大促平稳收官。你把 W6–W7 的优化经历写成文档--这将是简历上最硬的一条。
练 · 120 min
  1. 把 D42 的三条优化整理成一份完整案例文档
  2. 贴上优化前后的执行计划截图或文本
  3. 写出「为什么这个方案,而不是另一个方案」的取舍
  4. 写一段 3 分钟的口头版本,录音听一遍
  5. 提炼成简历上的一句话(带数字)
过关文档能独立看懂;口头版本 3 分钟内讲完且每句都经得起追问。
专注视图 ->