PostgreSQL中UUID类型的索引而不是主键

时间:2018-11-01 10:19:15

标签: postgresql indexing uuid

首先,我阅读了一些与此相关的信息,例如: Postgresql: UUID or SEQUENCE for primary key?

我的问题很简单:我表中的ID是UUID v4(在Rails或iOS应用中创建)。 由于默认情况下UUID是唯一的,是否可以删除ID上的主键并在其上添加索引?主要(也是uniq?)的目标是在每次插入时节省时间(几毫秒)(PostgreSQL不必验证ID是否已经使用)。

这是一个好选择吗?还是在插入之前保留PK以添加另一个唯一性验证?

有关信息,该表将管理大约1000万条记录。

2 个答案:

答案 0 :(得分:1)

首先:UUID并不是唯一的。但是,产生双精度值的机会确实很少(How unique is UUID?)。

但是UUID还有其他一些问题。 UUID用于在不同点之间交换数据。因此,如果您想到两个相互通信的数据库,它们将使用相同的UUID共享相同的数据集。现在考虑一个存档,其中存储了来自许多来源的数据集。您可能会从一些旧的通讯中获得具有相同UUID的数据集。

因此,如果这可能会引起任何问题,则取决于您的当前(或将来可能吗?)用例。

此外,我不确定它是否会对与主键索引空间有关的简单整数值产生任何好处。请注意,每个主键都会自动creates an internal index per default(因此,无需创建单独的索引)。因此,整数列的主键索引可能会更小和更快。

答案 1 :(得分:1)

您所描述的两个键显然都被用作代理键。代理的含义是它们不是从传入的数据派生的,因此除了提供唯一性之外与它们没有任何关系。

您不需要2个键即可提供唯一性,因此问题的答案是您可以放下其中一个键。表格的大小在这里并不是真正的因素,因为uuid_v4()将为超过1000万行的大数据集提供唯一性。

拥有2个唯一性键不仅是不必要的,而且还是瓶颈。这两个值都必须在插入时创建,并且都必须经过唯一性验证。删除其中之一显然是更好的做法。