如果我有一个包含数据的表列并在此列上创建索引,索引是否会占用与列本身相同的磁盘空间量?
我很感兴趣,因为我试图了解b-tree是否真的保留了叶子节点中列数据的副本,或者它们以某种方式指向它?
很抱歉,如果这是“Java会取代XML吗?”善意的问题。
更新:
创建了一个没有索引的表,只有一个GUID列,添加了1M行 - 26MB
与主键相同的表(聚集索引) - 25MB (甚至更少!),索引大小 - 176KB
具有唯一键的相同表(非聚集索引) - 26MB ,索引大小 - 27MB
因此,只有非聚簇索引占用的空间与数据本身一样多。
所有测量都在SQL Server 2005中完成
答案 0 :(得分:3)
B-Tree指向表中的行,但B-Tree本身仍占用磁盘上的一些空间。
某些数据库,有专门的表,它嵌入了主索引和的数据。在Oracle中,它被称为IOT - 索引组织表。
常规表中的每一行都可以通过内部ID(但它是特定于数据库)来识别,B-Tree使用该ID来标识该行。在Oracle中,它被称为rowid
,看起来像AAAAECAABAAAAgiAAA
:)
如果我有一个包含数据和表的列表 将在此列上创建索引 索引占用相同数量的光盘 空间作为列本身?
在基本B树中,您具有与列中项目数相同的节点数。
考虑1,2,3,4
:
1
/
2
\ 3
\ 4
确切的空间仍然可能有点不同(索引可能有点大,因为它需要存储节点之间的链接,它可能不完美平衡等等),我猜数据库可以使用优化来压缩部分的索引。但索引和列数据之间的数量级应该相同。
答案 1 :(得分:2)
我几乎可以肯定它非常依赖数据库,但一般来说 - 是的,它们需要额外的空间。这是因为两个原因:
这样你可以利用这个事实 BTREE叶子中的数据被排序;
您获得查找速度优势 你不必回头 提取必要的东西。
PS刚刚检查了我们的mysql服务器:对于一个20GB的表索引需要10GB的空间:)
答案 2 :(得分:0)
根据这个article判断,它实际上至少占用了与列中数据相同的空间量(无论如何,在PostgreSQL中)。 本文还提出了一种减少磁盘和内存使用的策略。
检查自己的方法是使用例如derby DB,创建一个包含一百万行和一列的表,检查它的大小,在列上创建一个索引并再次检查它的大小。如果您需要10-15分钟,请告知我们结果。 :)