1

我正在尝试了解 btree 索引的填充因子。从 postgres 文档中:

对于 B 树,在初始索引构建期间以及在右侧扩展索引(添加新的最大键值)时,叶页被填充到这个百分比。

首先,向右扩展索引是什么意思?这是否意味着分裂B树中最右边的叶子?(图像会有所帮助)。

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

据我所知,postgresql 在创建过程中会考虑填充因子。例如,填充因子 = 50%,在创建索引后,叶最多将充满 50%,然后,对于新的插入,此参数将不被考虑(预期此“右扩展”)。

4

1 回答 1

0

B-tree 索引的最右边的叶页是其中具有最大值的叶页:

                        +---------+
                        |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设置如何。然后第一个UPDATE不是HOT并创建新索引条目的会导致索引页面被拆分,这很昂贵。这将违背将 a 设置为fillfactor低于 100 以防止过度的页面拆分和碎片的概念。

由于INSERTs 无处不在,例如主键的 UUID,许多叶子页面将自动不会被完全填满。

于 2021-10-15T05:57:27.920 回答