我创建了一个表“global_settings”,用于存储 Web 应用程序的不同设置——我希望能够在 html 页面上编辑的设置:
global_settings:
id primary key,
key varchar(100),
value varchar(1000),
extra_data jsonb
其中key
已给出UNIQUE
约束。
假设最多有 100 个设置。
然而,正如我已经意识到的那样,key
有时可能会达到 100 个字符左右。因为我想把这件事说清楚。
UNIQUE
平均而言,这些类型的长键索引会VARCHAR
添加到数据库中多少额外磁盘空间?的大小int64
是 8 个字节,而这key
将......大 10 倍以上。因此,磁盘空间增加了 10 倍以上。正确的?
key
如果我有数千个这样的数据库,那么与有int64
?的情况相比,数据库的大小会增加 10 倍。
varchar
100 个 ASCII 字母的值在磁盘上占用 101 个字节。Anint8
(这是 Postgres 中的内部名称bigint
,而不是)占用 8 个字节。int64
所以是的,大了 12 倍以上。或者对于占用多个字节的非 ASCII 字母来说甚至更大。但对于只有 100 行的情况来说,这根本不重要。对于这么小的表来说,即使存在索引也几乎不重要。
对于数千行(或数百万行),是的,这种大小差异很重要。为了桌子。但对于指数来说更是如此。您的行很宽,因此 100 字节仅占总行大小的百分之几。但索引会增长到原来大小的 10 倍,这对性能不利。
md5()
如果您需要那么长的键,请考虑对使用或生成的哈希进行索引hashtextextended()
。看: