Mat*_*zzi 9 postgresql storage database-design heroku
我要将记录存储在一个包含2个字段的表中:
id - > 4个字符
password_hash - > 64个字符
我可以在Heroku上的5mb PostgreSQL中存储多少个像上面那样的记录?
PS:给定一个包含x列且长度为y的表 - 如何计算数据库中的空间?
Erw*_*ter 20
计算磁盘空间并非易事.你必须考虑到:
每个表的开销(小,基本上是系统目录中的条目,可能不会影响你在Heroku上).
该开销每行(HeapTupleHeader)和每个数据页(PageHeaderData).手册中有关页面布局的详细信息.
数据类型对齐丢失的空间.
NULL位图的空间.有效免费使用8列或更少的表格,与您的情况无关.
UPDATE/ 之后的死行DELETE.
索引的大小.你会有一把主键,对吧?索引大小类似于仅包含索引列且开销较少的表的索引大小.
数据的实际空间要求,具体取决于各自的数据类型.手册中字符类型(包括固定长度类型)的详细信息:
短字符串(最多126个字节)的存储要求是1个字节加上实际字符串,其中包括空间填充
character.较长的字符串有4个字节的开销而不是1个字节
系统目录中所有类型的更多详细信息pg_type.
数据库编码特别适用于字符类型.UTF-8使用最多四个字节来存储一个字符(但是7位ASCII字符总是只占用一个字节,即使在UTF-8中也是如此.)
其他可能影响你案件的小事,比如TOAST--这对64字符串不会影响你.
查找估计值的一种简单方法是创建测试表,用虚拟数据填充它并使用数据库对象大小函数进行测量:
SELECT pg_size_pretty(pg_relation_size('tbl'));
Run Code Online (Sandbox Code Playgroud)
包括索引:
SELECT pg_size_pretty(pg_total_relation_size('tbl'));
Run Code Online (Sandbox Code Playgroud)
快速测试显示以下结果:
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
Run Code Online (Sandbox Code Playgroud)
添加主键后:
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB
Run Code Online (Sandbox Code Playgroud)
所以,我预计最多大约44,000行没有,大约36k行有主键.