b树的填充因子.为什么在右边扩展索引时要考虑填充因子,而在其他情况下(除了在创建索引期间)则不考虑填充因子?



我试图理解b树索引情况下的填充因子。从postgres文档:

对于b树,叶页在初始化时被填充到这个百分比索引构建,以及在扩展索引时(添加

首先,扩展右边的索引是什么意思?它是否意味着在b树中分裂最右边的叶子?(图片会有帮助)。

为什么在这种情况下要考虑填充因子,而不是仅在创建索引时才考虑填充因子?

据我所知,postgresql将在创建时考虑填充因子。例如,如果填充因子= 50%,则在索引创建之后,叶子最多填充50%,然后,对于新的插入,该参数将不被尊重(对于这个"右扩展"是预期的)。

b树索引最右边的叶页是其中值最大的页:

+---------+
|root page|
+---------+
/          
/            
+----------+              +----------+
|inner page|              |inner page|
+----------+              +----------+
/                         /       
/                         /         
+-----------+  +-----------+  +-------------+  +-------------+
|1 3 ... 100|  |101 ... 900|  |1000 ... 2000|  |2000 ... 5000|
+-----------+  +-----------+  +-------------+  +-------------+
leaf page      leaf page       leaf page    rightmost leaf page

由于将新值插入到最右边的页面是一种常见的情况,例如使用自动递增的序列值或使用不断增加的时间戳,因此此处的插入将被区别对待,就像创建索引一样。基本原理是这样的插入通常是由INSERTs而不是UPDATEs引起的。

如果将最右边的页面与所有其他页面一样处理,那么自动递增的主键或时间序列通常会创建一个密集的索引,而不管fillfactor设置如何。然后,第一个不是HOT的UPDATE并创建一个新的索引条目将导致拆分索引页,这是昂贵的。这将违背将fillfactor设置为100以下以防止过度的页面分割和碎片的概念。

到处都是INSERT,就像主键的uuid一样,许多叶页将不会自动被完全填充。

最新更新