百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

ULID和UUID在Postgres数据库中的性能

nanshan 2024-11-14 16:38 26 浏览 0 评论

更多编程技术文章,请查阅IOKKS - 专业编程技术分享平台

我将使用PostgreSQL数据库和演示Java服务来比较查询速度。

UUID和ULID

为什么我们需要一些难以理解的ID类型?我不会谈论分布式系统、服务的连接性、敏感数据等等。如果有人对此感兴趣,可以自行搜索 - 目前我们感兴趣的是性能。正如其名称所示,我们将讨论两种类型的键:UUID和ULID。

UUID早已为人所知,但ULID对一些人来说可能不太熟悉。ULID的主要优势在于它是单调递增的,是一种可排序的类型。当然,这些并不是所有的区别。就我个人而言,我也喜欢它没有特殊字符这一事实。

一个小插曲,我很久以前就注意到许多团队在PostgreSQL数据库中使用varchar(36)数据类型来存储UUID,我不喜欢这样,因为这个数据库有相应的UUID数据类型。稍后,我们将看到在数据库端存储UUID的不同格式时,哪种类型更可取。因此,我们将不仅比较后端的两种数据类型,还将比较在不同格式下存储UUID时的差异。

比较

让我们开始比较这些事情。

  • UUID有36个字符长,占用128位内存。
  • ULID有26个字符长,同样占用128位内存。

对于我的示例,我在数据库中创建了两个表,每个表有三个字段:

CREATE TABLE test.speed_ulid
(
    id      varchar(26) PRIMARY KEY,
    name    varchar(50),
    created timestamp
);
CREATE TABLE test.speed_uuid
(
    id       varchar(36) PRIMARY KEY,
    name    varchar(50),
    created timestamp
);

对于第一次比较,我以通常的方式将UUID存储为varchar(36)格式。在数据库中,我在每个表中记录了1,000,000条数据。

测试用例将包括100个请求,使用先前从数据库中提取的标识符;也就是说,在调用测试方法时,我们将100次访问数据库并通过键检索实体。在测量之前,将创建并预热连接。我们将进行两次测试运行,然后进行10次有效迭代。为了您的方便,我将在文章末尾提供Java代码的链接。

抱歉,但是这些测量是在标准的MacBook Pro笔记本电脑上进行的,而不是在专用服务器上进行的,但我相信除了在数据库和后端之间的网络流量增加之外,结果不会有显著的差异。

以下是一些背景信息:

  • # CPU I9-9980HK
  • # CPU核数:16
  • # RAM:32GB
  • # JMH版本:1.37
  • # VM版本:JDK 11.0.12, Java HotSpot(TM) 64位服务器VM, 11.0.12+8-LTS-237
  • # DB: PostgreSQL 13.4, build 1914, 64位

将用于通过键获取实体的查询:

SELECT * FROM test.speed_ulid where id = ?
SELECT * FROM test.speed_uuid where id = ?

测量结果

让我们来看看测量结果。请记住,每个表都有1,000,000行数据。

两种类型的标识符都以varchar形式存储在数据库中

我进行了几次测试,结果大致相同:ULID要么稍快,要么UUID稍快。从百分比来看,差异几乎为零。

好吧,你可能会不同意这两种类型之间没有差异。我会说,在数据库端使用其他数据类型是不可能的。

UUID作为数据库中的uuid,ULID作为varchar

对于下一个测试,我将test.speed_uuid 表中的数据类型从varchar(36)更改为uuid。

在这种情况下,差异是明显的:UUID比ULID快4.5%。

正如你所看到的,如果在服务端有相同名称的类型,那么在数据库端使用uuid数据类型是有意义的。这种格式的索引在PostgreSQL中经过了很好的优化,并显示出良好的结果。

好吧,现在我们可以明确地分道扬镳了。还是吗?

如果你查看索引搜索查询计划,你会看到在使用varchar时是这样的((id)::text = '01HEE5PD6HPWMBNF7ZZRF8CD9R'::text)。

总的来说,比较两个文本变量是一个相当慢的操作,所以也许没有必要以这种格式存储ID。或者是否有其他方法可以加快键的比较速度?首先,让我们为具有ULID的表创建另一个“hash”类型的索引。

create index speed_ulid_id_index
    on test.speed_ulid using hash (id);

让我们看看我们查询的执行计划:

我们将看到数据库在这种情况下使用了哈希索引,而不是btree。让我们运行我们的测试,看看会发生什么。

varchar + index(hash) for ULID, uuid for UUID

这种组合相对于uuid及其欺骗性索引增加了2.3%。

我不确定在一个字段上保留两个索引是否有道理。因此,值得考虑是否还有其他事情可以做。在这里,值得回顾一下过去,记得以前是如何存储uuid或其他字符串标识符的。没错:要么文本,要么字节数组。

所以让我们尝试这个选项:我删除了ULID的所有索引,将其转换为bytea,并重新创建了主键。

bytea for ULID, uuid for UUID

结果,我们得到了与上一次运行中额外索引的结果大致相同,但我个人更喜欢这个选项。

在数据库中有2,000,000行数据时的测量结果:

在数据库中有3,000,000行数据时的测量结果:

我认为没有继续进行更多的测量的必要。模式保持不变:以bytea格式保存的ULID在数据库中略优于以uuid格式保存的UUID。

如果我们从第一次测量中获取数据,显然,通过一些小的操作,你可以将性能提高约9%,如果使用varchar。

因此,如果你读到这里,我认为这篇文章对你来说是有趣的,你已经为自己得出了一些结论。

值得注意的是,测量是在后端部分和数据库端都处于理想状态下进行的。我们没有任何并行进程在数据库中写入数据,更改记录,或在后端进行复杂的计算。

结论

让我们回顾一下材料。你学到了什么有用的东西?

  1. 不要忽视PostgreSQL端的uuid数据类型。也许有一天在这个数据库中会出现ULID的扩展,但目前我们只能使用现有的。
  2. 有时手动创建所需类型的额外索引是值得的,但需要考虑开销。
  3. 如果你不怕做一些不必要的工作 - 即编写自己的类型转换器 - 那么如果在数据库端没有相应的类型,你应该尝试bytea。

对于主键应该使用什么类型的数据,以及应该以什么格式存储,我没有明确的答案:这一切都取决于许多因素。值得注意的是,对于ID的数据类型的明智选择,在某个时刻可能会在你的项目中发挥重要作用。

相关推荐

微软发布Win11/10 ISO镜像Defender更新,提升系统初始安全性

IT之家7月27日消息,除了Setup及WinRE更新外,NeoWin发现微软本周还针对Windows11/10/Server安装镜像发布了新的Defender安全智能...

微软革新Windows装机体验:内置应用全面升级,安全与便捷双提升

Windows内置应用迎来重大变革:更安全、更快速的初始体验如果您曾亲自安装过Windows11,或许注意到其内置应用并非开箱即用,而是一些占位程序,需要首次运行时从微软应用商店(Microsoft...

Hotpatch继续扩展 现在更多Windows PC在更新后无需重启

Windows11最近从其服务器版本中获得了一项非常重要的功能:Windows热补丁。该功能旨在通过允许操作系统在无需重启的情况下安装重要的安全更新来最大限度地减少停机时间和中断。最初,微软在...

微软承认Windows Server六月更新存在BUG:导致DHCP服务器故障

IT之家6月17日消息,科技媒体WindowsLatest今天(6月17日)发布博文,报道称微软承认6月WindowsServer更新存在BUG,可能导致DHCP服...

Windows Server2019安装Hyper-V的2个简单方法!

关于WindowsServer2019WindowsServer2019是微软发布的服务器操作系统,是WindowsServer2016的后续版本。它包含了许多新的特性和改进,适用于数据中心...

如何在不满足系统要求的旧计算机上安装 Windows 11 24H2

如果你想了解这个安装工具以及安装方法(老飞摄影微信公众号内提供安装包下载),请完整的看完后面的文字,以避免在安装过程当中出现问题。Windows11通常需要某些硬件功能,例如TPM和安全启动,...

第 137 期:微软表示 Windows 11 24H2 是迄今为止最稳定的版本

就在刚刚,微软“大言不惭”地声称,Windows1124H2是迄今为止最可靠的Windows版本。我们并不是说它很糟糕,因为我们每天的工作中也在使用它。上述言论只是一份微软的一份官方文件的一...

Windows 11 将推出带有“高级”选项的新设置页面

Windows11即将迎来一个包含一些高级功能的全新“设置”页面。严格来说,它并非全新功能。它更像是“开发者”栏目的重新设计,用户和开发者可以在其中调整各种附加功能。微软可能明白这些东西不仅对开发...

Windows server 2025 重复数据删除

一、概述windowsserver中的重复数据删除功能从windowsserver2012就开始支持了。Windowsserver中默认没有安装重复数据删除功能。在磁盘分区(卷)上启用重复...

Windows Server 2025预览版迎来更新,微软改善Insiders测试体验

在发布WindowsServer的build26040版本之际,微软公布了该产品的官方名称:WindowsServer2025。一同推出的,还有Windows11WindowsInsid...

升不升?Win11 24H2大范围推送了

微软在其官方支持文档中宣布,24H2版现在已经开始向运行Windows11原始版本、22H2和23H2版的合格设备推送。Windows11的24H2更新现已进入新的可用性阶段,这意味着更多符合条件...

微软发布Win11/10/Server安装镜像Defender更新

IT之家6月22日消息,继上个月为Lumma发布更新后,微软本月也为Windows11/10/Server安装镜像发布了新的Defender更新。此更新包很有必要,因为Wi...

第 81 期:微软最近的更新给 Windows Server 带来了 DHCP 问题

近日,微软确认,DHCP服务器服务可能会在WindowsServer安装2025年6月更新后停止响应或拒绝连接。DHCP问题会影响WindowsServer2025(KB50...

windws server 2012 R2 虚拟机windows server2019 经常断网事件

故障现象:在windowsserver2012R2的虚拟主机上面搭建一个Windowsserver2019的虚拟机系统用来做域控。安装完设置好防火墙和IP,经过测试是可以ping同正常访问...

微软扩展热补丁部署,现覆盖ARM架构Win11 24H2设备

IT之家7月9日消息,科技媒体NeoWin今天(7月9日)发布博文,报道称微软扩大热补丁(WindowsHotpatching)覆盖范围,在AMD和英特尔处理器设备外,现覆盖支...

取消回复欢迎 发表评论: