Lyst Engineering Blog 中的数据库与性能优化案例

Lyst Engineering Blog 里与数据库和性能优化直接相关的案例主要有三类:Postgres 列变更的最小停机迁移、70GB Django 会话数据的存储迁移,以及用 New Relic 配合 Python profiler 做服务性能调优。这些文章的共同点是都从生产环境的真实约束出发——锁、依赖、数据量、线上流量——而不是只讲工具怎么用。如果你正面临类似的迁移或调优任务,可以按下面的分类找到对应参考。

用最小停机时间修改 Postgres 列

对应文章:Altering a Postgres Column with Minimal Downtime

这篇文章的切入点是:在线上库改一个列,真正的风险不在 ALTER 语句本身,而在它持有的锁和它牵连的依赖对象。

可借鉴的思路包括:

  • 先理清依赖:视图、外键、索引、触发器、默认值等都可能依赖目标列,改列前需要确认哪些对象会受影响,否则迁移可能失败或产生意外行为。
  • 理解锁的行为:不同 ALTER 操作获取的锁级别不同,某些操作会阻塞读写。文章强调通过理解锁来安排迁移顺序,把停机窗口压到最小。
  • 分步执行:把一次大变更拆成多个小步骤,逐步验证,避免单条语句长时间持锁。

适用条件:适合有线上流量、不能接受长时间锁表的 Postgres 库。如果你的库可以随意停机,直接改列更省事,不必套用这套流程。

迁移 70GB 会话数据:Django SessionStore 与 DB Router

对应文章:Django Session store and DB Router

这篇文章记录的是把 70GB 会话数据搬到新存储的过程,核心手段是两个:

  • 自定义 SessionStore 类:接管会话的读写逻辑,让应用层可以在不改业务代码的前提下切换底层存储。
  • DB Router:控制 Django 的数据库路由,把会话数据的读写导向新的存储,与原有业务库解耦。

这个方案的价值在于:会话数据量大、读写频繁,直接停机迁移不现实;通过自定义存储类加路由,可以做到平滑过渡。适用条件是使用 Django 且会话数据已经大到影响主库性能的场景。如果会话量很小,直接换存储后端即可,不需要引入自定义类和路由这层复杂度。

用 New Relic 和 Python profiler 做基础性能调优

对应文章:Basic service performance tuning New Relic and the python profiler

这是一篇偏入门的调优记录,组合使用两个工具:

  • New Relic:从服务层面观察响应时间、吞吐和慢请求分布,定位是哪个服务或哪个环节慢。
  • Python profiler:在代码层面下钻,找出具体是哪些函数或调用占用了时间。

两者配合的逻辑是:先用监控工具缩小范围,再用 profiler 精确定位,避免一上来就盲目 profile 整个服务。适用条件是需要先建立性能基线的服务;如果还没有任何监控,先接入监控比直接上 profiler 更有效。

这些案例的共性

案例 核心问题 关键手段 适用条件
Postgres 列变更 锁与依赖导致停机 理清依赖、理解锁、分步执行 线上库、不能长时间锁表
会话数据迁移 70GB 数据无法停机搬 自定义 SessionStore + DB Router Django、会话数据量大
服务性能调优 不知道慢在哪 New Relic 定位 + profiler 下钻 已有或准备接入监控的服务

三个案例都体现了同一个取向:先搞清楚约束(锁、依赖、数据量、流量),再选工具和步骤。想深入某一篇,可以直接在 making.lyst.com 上按标题查找原文。

making.lyst.com