Spanner的二级索引没有像普通数据库那样具有碎片整理的重组命令。
我知道这是没有必要的,因为扳手压缩和分割可以消除碎片。 我的理解正确吗?
正确 — Spanner 索引通常会自动进行碎片整理。
传统数据库有“堆文件”的概念,其中数据被就地修改。例如,如果删除一行,或者截断大字符串列等,则其数据将从堆文件的中间删除,留下空白空间。随着时间的推移,文件会获得大量不同大小的空白空间,从而导致碎片。
Spanner 与大多数现代数据库引擎一样,根本没有这种类型的堆文件。相反,它使用日志结构合并树进行存储。这些结构不会就地修改数据。因此,虽然它们容易受到其他问题的影响,但它们却不受这种“传统”形式的碎片化影响。
您可以观察 Spanner 最接近的“碎片”,如下(仅一个示例):如果您更改大量数据,例如大量加载或删除许多但不是全部行,您可能会注意到 CPU操作完成后,利用率会在短时间内保持较高水平。这是因为 Spanner 批量加载通常将数据分割成许多单独的块,并且将这些块并置在存储中(包括索引)可能会更有效。
您在这个短暂提升的 CPU 中看到的是一个后台“压缩”进程,它会自动重新组织数据以提高效率。压缩是自动发生的,通常是增量的,并且仅限于一部分数据。但如果您一次进行足够的更改,您可以看到它们显示在指标中。