Heroku上的PostgreSQL数据库,5MB可以存储多少条记录?

17

我打算在一张只有2个字段的表中存储记录:

  • id -> 4个字符

  • password_hash -> 64个字符

在Heroku上的5mb PostgreSQL数据库中,我最多能存储多少个像上面那样的记录?

P.S.: 给定一个包含x列和长度为y的单个表 - 我如何计算它在数据库中所需的空间?


你是要将行插入到数据库中,还是也想更新/删除它们? - Szymon Lipiński
这会影响所占用的空间吗?无论如何,我认为更新不会影响,但删除操作可能会。 - Matteo Pagliazzi
@MatteoPagliazzi:更新/删除会留下死行,占用空间只有VACUUMCLUSTER才能恢复。 - Erwin Brandstetter
请注意,5mb是一个“软”限制。您可以超过这个限制。一旦您开始推送50mb,他们将要求您升级。 - Mitch Dempsey
1个回答

38

磁盘空间占用

计算磁盘空间并不容易。你需要考虑到以下因素:

  • 每张表的开销。这些基本上是系统目录中的项。

  • 每行的开销HeapTupleHeader)和每个数据页的开销(PageHeaderData)。有关页面布局的详细信息请参阅手册。

  • 由数据类型决定的,因列对齐而丢失的空间。

  • NULL 位图所占用的空间。对于少于8列的表来说,实际上是免费的,与您的情况无关。

  • UPDATE / DELETE 后的死行。(直到空间最终被清理并重复利用。)

  • 索引(es) 的大小。你会有一个主键,对吧?索引的大小类似于仅包含索引列并且每行开销较小的表。

  • 数据实际所需的空间,取决于各自的数据类型手册中关于字符类型(包括固定长度类型)的详细信息

    短字符串(最多126个字节)的存储需求为1个字节加上实际的字符串,其中包括在情况下的空格填充 of character。长字符串的开销是1而不是4个字节。

    所有类型的更多详细信息请参阅系统目录pg_type

  • 数据库编码,特别是字符类型所需的空间。UTF-8使用最多四个字节来存储一个字符(但7-Bit-ASCII字符始终占用一个字节,即使在UTF-8中也是如此)。

  • 其他可能影响您情况的小事项,例如TOAST - 对于64字节的字符串,这不应该影响您。

使用测试用例进行计算

估算空间占用的一个简单方法是创建一个测试表,填充虚拟数据并使用数据库对象大小函数进行测量:

SELECT pg_size_pretty(pg_relation_size('tbl'));

包括索引:

SELECT pg_size_pretty(pg_total_relation_size('tbl'));

参见:

一项快速测试显示以下结果:

CREATE TABLE test(a text, b text);
INSERT INTO test -- quick fake of matching rows
SELECT chr((g/1000 +32)) || to_char(g%1000, 'FM000')
     , repeat (chr(g%120 + 32), 64)
FROM   generate_series(1,50000) g;

SELECT pg_size_pretty(pg_relation_size('test'));       -- 5640 kB
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 5648 kB

添加主键后:

ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);

SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB

因此,我预计没有主键时最多会有44k行,有主键时最多会有36k行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接