我试图理解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
由于将新值插入到最右边的页面是一种常见的情况,例如使用自动递增的序列值或使用不断增加的时间戳,因此此处的插入将被区别对待,就像创建索引一样。基本原理是这样的插入通常是由INSERT
s而不是UPDATE
s引起的。
如果将最右边的页面与所有其他页面一样处理,那么自动递增的主键或时间序列通常会创建一个密集的索引,而不管fillfactor
设置如何。然后,第一个不是HOT的UPDATE
并创建一个新的索引条目将导致拆分索引页,这是昂贵的。这将违背将fillfactor
设置为100以下以防止过度的页面分割和碎片的概念。
到处都是INSERT
,就像主键的uuid一样,许多叶页将不会自动被完全填充。