代码之家  ›  专栏  ›  技术社区  ›  Valentin V

DB索引占用的磁盘空间是否与列数据相同?

  •  6
  • Valentin V  · 技术社区  · 16 年前

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

    我之所以感兴趣,是因为我想了解b-树是否真的在叶节点中保留了列数据的副本,或者它们以某种方式指向它?

    更新:

    创建了一个没有索引且只有一个GUID列的表,添加了1M行- 260万

    25兆 (甚至更少!),索引大小-

    具有唯一键的同一表(非聚集索引)- 260万 270万

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

    3 回复  |  直到 16 年前
        1
  •  4
  •   ewernli    16 年前

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

    有的数据库,有专门的表,其中嵌入了主索引 数据。在Oracle中,它被称为IOT——索引组织表。

    rowid 看起来像 AAAAECAABAAAAgiAAA :)

    如果我有一个包含数据和 在该列上创建索引,将 索引采用相同数量的磁盘 列本身的空间?

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

    考虑 1,2,3,4

        1 
      / 
    2
       \ 3 
          \ 4
    

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

        2
  •  2
  •   Anton    16 年前

    1. 对树叶中的数据进行排序;

    2. 你不必回心转意

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

        3
  •  0
  •   Tomislav Nakic-Alfirevic    16 年前

    由此判断 article

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