假设我有一张宽user_account
桌子。
它是重读表,并且很少发生对该表的更新,除了一列:该表有列last_active_at
,每次用户发出请求时都会更新。
last_active_at
碰巧很少被阅读。
last_active_at
将列移动到单独的表是否有意义?
我的想法是,这将减少与user_account
表相关的任何查询的锁定时间。
假设我有一张宽user_account
桌子。
它是重读表,并且很少发生对该表的更新,除了一列:该表有列last_active_at
,每次用户发出请求时都会更新。
last_active_at
碰巧很少被阅读。
last_active_at
将列移动到单独的表是否有意义?
我的想法是,这将减少与user_account
表相关的任何查询的锁定时间。
last_active_at
每次用户提出请求时更新如果这些请求发生得相当频繁,那么是的,将列分成单独的表是有意义的。
写锁可能是同一张表上大量并发写入负载的问题,在同一行上重叠。但你所描述的情况不应该是这样。Postgres 的 MVCC 模型确保读取器不会阻塞写入器,写入器不会阻塞读取器。手册:
但是,由于相同的 MVCC 模型,频繁更新行会导致大量写入成本- 以及表和索引膨胀。特别是如果以下一项或多项适用:
autovacuum
很难跟上。然后将其拆分
last_active_at
为与主表 1:1 关系的单独表可能是值得的。更新只会留下非常小的死元组,并且只会(通常)膨胀两个索引。与其他写入的锁争用(通常)会减少,VACUUM
成本会下降。SELECT
在主表上将不得不读取更少的数据页并且速度更快。但是,无论何时必须加入附加表,都会在查询中引入额外的成本和复杂性。在没有膨胀的原始条件下,由于每行增加的开销、另一个 ID 列和其上的索引,存储大小会增加。但是,如果臃肿不是问题,那么一开始就没有必要进行拆分。