(作者好萌)
我们有一些晚上运行的 ETL 进程,主要是在产品和用户表上做维护。这些 ETL 操作会更新字段然后插入表,这样它们也会获得了表的锁。
那么问题是什么?...当 select_for_update 与 select_related 一起使用时,Django 将尝试获取查询中所有表的锁。
我们用来获取事务的代码尝试获取事务表、用户、产品、类别表的锁。...一旦 ETL 在午夜锁定了后三个表,交易就开始失败。
一旦我们对问题有了更好的理解,我们就开始寻找只锁定必要表(事务表)的方法。...顾名思义,BRIN 索引会在表格中的一系列相邻块上创建一个小型索引。该索引非常小,只能说明某个值是否在范围内,或者是否在索引块范围内。
我们来做一个 BRIN 索引如何帮助我们的简单例子。...假设我们在一列中有这些值,每一个都是一个块:
1, 2, 3, 4, 5, 6, 7, 8, 9
我们为每三个相邻的块创建一个范围:
[1,2,3], [4,5,6], [7,8,9]
对于每个范围,我们将保存范围内的最小值和最大值