10

如果我有一个包含数据的表列并在该列上创建索引,该索引会占用与列本身相同数量的磁盘空间吗?

我很感兴趣,因为我试图了解 b 树是否实际上将列数据的副本保存在叶节点中,或者它们以某种方式指向它?

抱歉,如果这是“Java 会取代 XML 吗?” 好问题。

更新:

使用单个 GUID 列创建了一个没有索引的表,添加了 1M 行 - 26MB

具有主键(聚集索引)的同一张表 - 25MB(甚至更少!),索引大小 - 176KB

具有唯一键的同一张表(非聚集索引) - 26MB,索引大小 - 27MB

因此,只有非聚集索引占用的空间与数据本身一样多。

所有测量均在 SQL Server 2005 中完成

4

3 回答 3

4

B-Tree 指向表中的行,但 B-Tree 本身仍然占用一些磁盘空间。

一些数据库,有嵌入主索引数据的特殊表。在 Oracle 中,它被称为 IOT——索引组织表。

常规表中的每一行都可以通过 B-Tree 用来识别行的内部 ID(但它是特定于数据库的)来标识。在 Oracle 中,它被称为rowid并且看起来像AAAAECAABAAAAgiAAA:)

如果我有一个包含数据的表列并在该列上创建索引,该索引会占用与列本身相同数量的磁盘空间吗?

在基本的 B 树中,您的节点数与列中的项目数相同。

考虑1,2,3,4

    1 
  / 
2
   \ 3 
      \ 4

确切的空间仍然可能有点不同(索引可能有点大,因为它需要存储节点之间的链接,它可能无法完美平衡等),我猜数据库可以使用优化来压缩部分索引. 但是索引和列数据之间的数量级应该是相同的。

于 2010-03-05T09:23:54.660 回答
2

我几乎可以肯定它完全依赖于数据库,但通常——是的,它们占用了额外的空间。发生这种情况有两个原因:

  1. 这样您就可以利用 BTREE 叶子中的数据已排序的事实;

  2. 您获得查找速度优势,因为您不必来回寻找来获取必要的东西。

PS 刚刚检查了我们的 mysql 服务器:对于 20GB 的表索引需要 10GB 的空间 :)

于 2010-03-05T09:26:07.437 回答
0

从这篇文章来看,事实上,它至少会占用与列中的数据相同的空间(无论如何,在 PostgreSQL 中)。这篇文章还提出了一种减少磁盘和内存使用的策略。

一种检查自己的方法是使用例如 derby DB,创建一个包含一百万行和一列的表,检查它的大小,在列上创建索引并再次检查它的大小。如果您花 10-15 分钟这样做,请告诉我们结果。:)

于 2010-03-05T09:33:55.847 回答