一尘不染

PostgreSQL:在大型数据库上定义主键

sql

我正在计划一个数据库来存储大量文本。(博客文章,新闻文章等)。数据库需要具有标题,内容(最多50k个字符),日期,链接和语言字段。同一内容不能出现在一个链接上。旧内容(例如,早于30天)将被删除。

现在,问题出在主键上。我可以设置一个自动递增(SERIAL类型)字段并将其用作主键。但是,这看起来很愚蠢,而且浪费了磁盘空间,因为该字段仅用作主键不会有任何用途。(该字段最终是否会用完??)始终存在另一个性能问题:需要检查插入的每个新行的内容是否重复。因此,我想出的另一种主键解决方案是计算content+ link值的sha256哈希值,然后将其放入新的“ hash”列中,并将其用作主键。两只鸟和一块石头。当然,问题在于哈希冲突。这是一个很大的威胁吗?

我没有PostgreSQL的经验,也没有DBMS的经验,所以在创建具有蜗牛在高速公路上的性能特征的数据库(可怕的比较)之前,我将不胜感激。

如果您有大型数据库的经验,请在这里帮助我。在我的情况下,将64字符串设置为主键字段是个好主意吗?(因为我的印象是通常可以避免这种情况)


阅读 178

收藏
2021-03-17

共1个答案

一尘不染

刚刚对一个相当大的数据库(200GB+)做了这个精确的测试,bigserial赢得了很大的优势。生成速度更快,加入速度更快,代码更少,占地面积更小。由于postgres的存储方式,与普通int相比,bigint可以忽略不计。在您不必担心溢出bigint之前,您的内容将耗尽存储空间。完成了对bigint的计算得出的哈希-
完全替代bigint。

2021-03-17