云数据库技术

PostgreSQL 18发布,正在加速追赶MySQL

PostgreSQL 全球开发团队今天宣布发布 PostgreSQL 18,很多功能都是向MySQL开炮。本文介绍PostgreSQL 18发布的主要新特性,以及MySQL对应版本和发布时间。

Image

引入异步 I/O(mysql5.5开始支持aio,2010年)

PostgreSQL 以前依赖操作系统的预读机制来加速数据检索。然而,由于操作系统对数据库特定的访问模式缺乏了解,它们并不总是能够预测将需要哪些数据,导致许多工作负载的性能不佳。PostgreSQL 18 引入了一个新的异步 I/O(AIO)子系统,旨在解决这一限制。AIO 允许 PostgreSQL 并发发出多个 I/O 请求,而不是等待每个请求依次完成。这扩展了现有的预读并提高了整体吞吐量。

PostgreSQL 18 支持的 AIO 操作包括顺序扫描、位图堆扫描和清理。基准测试表明,在某些场景中性能提升高达 3 倍。新的 io_method 设置允许您在 AIO 方法(包括 worker 和 io_uring)之间切换,或者您可以选择使用 sync 设置保持当前的 PostgreSQL 行为。现在有更多参数需要考虑调整 AIO,您可以在文档中了解更多信息。

更快的升级,更好的升级后性能(mysql8.0支持统计信息持久化,大版本升级后也不会丢失,2019年)

PostgreSQL 的一个关键特性是生成和存储有助于 PostgreSQL 选择最有效查询计划的统计信息。在 PostgreSQL 18 之前,这些统计信息在主要版本升级时不会保留,这可能导致繁忙系统上的查询性能显著下降,直到 ANALYZE 完成运行。PostgreSQL 18 引入了在主要版本升级过程中保留计划器统计信息的能力,这有助于升级后的集群在升级后更快地达到预期性能。此外,pg_upgrade 是执行主要版本升级的工具,在 PostgreSQL 18 中包含了几项增强功能,例如当数据库包含许多对象(如表和序列)时升级速度更快。

此版本还允许 pg_upgrade 根据 --jobs 标志的设置并行处理其检查,并添加了 --swap 标志,该标志交换升级目录而不是复制、克隆或链接文件。

查询和一般性能增强(mysql8.0支持 index skip scan ,2019年)

PostgreSQL 18 通过自动使您的工作负载更快的功能进一步加速查询性能。此版本引入了在多列 B 树索引上的“skip scan”查找,提高了省略一个或多个前缀索引列上的 = 条件的查询的执行时间。它还可以优化使用 WHERE 中的 OR 条件的查询以使用索引,从而显著提高执行速度。还有许多改进用于 PostgreSQL 如何计划和执行表连接,从提高哈希连接的性能到允许合并连接使用增量排序。

PostgreSQL 18 还支持 GIN 索引的并行构建,加入 B 树和 BRIN 索引以支持此功能。此版本还建立在 PostgreSQL 对硬件加速的支持之上,包括对 ARM NEON 和 SVE CPU 内在函数的支持,用于 popcount 函数,该函数由 bit_count 和其他内部功能使用。

增强开发人员体验(mysql5.7支持逻辑虚拟生成列,2015年)

PostgreSQL 18 引入了在查询时计算值而不是存储它们的虚拟生成列。这现在是生成列的默认选项。此外,存储的生成列现在可以进行逻辑复制。此版本添加了在 INSERT、UPDATE、DELETE 和 MERGE 命令的 RETURNING 子句中访问旧(OLD)和新(NEW)值的能力。

PostgreSQL 18 还通过 uuidv7() 函数添加了 UUIDv7 生成,让您生成时间戳有序的随机 UUID 以支持更好的缓存策略。PostgreSQL 18 包括 uuidv4() 作为 gen_random_uuid() 的别名。

PostgreSQL 18 添加了使用 WITHOUT OVERLAPS 子句对 PRIMARY KEY 和 UNIQUE 约束的范围约束,以及使用 PERIOD 子句对 FOREIGN KEY 约束的约束。最后,PostgreSQL 18 通过使用本地表的定义创建外部表的架构定义,使创建外部表的架构定义更加容易,使用 CREATE FOREIGN TABLE ... LIKE 命令。

改进的文本处理(mysql支持对每个字段定义和sql查询指定字符集比较策略)

PostgreSQL 18 通过几项新增强功能使文本处理更简单和更快。此版本添加了 PG_UNICODE_FAST 排序规则,为大小写转换提供完整的 Unicode 语义,同时帮助加速许多比较。这包括 upper 和 lower 字符串比较函数以及用于不区分大小写比较的新 casefold 函数。

此外,PostgreSQL 18 现在支持对使用非确定性排序规则的文本进行 LIKE 比较,简化了如何执行更复杂的模式匹配。此版本还将全文搜索更改为使用集群的默认排序规则提供程序,而不是始终使用 libc,这可能需要在运行 pg_upgrade 后重新索引所有全文搜索和 pg_trgm 索引。

身份验证和安全功能(mysql不支持oauth身份认证;mysql8.0支持SHA-2加密密码,2019年)

PostgreSQL 18 引入了 oauth 身份验证,让用户可以通过 PostgreSQL 扩展支持的 OAuth 2.0 机制进行身份验证。此外,PostgreSQL 18 包括对 FIPS 模式的验证,并添加了 ssl_tls13_ciphers 参数,用于配置服务器端 TLS v1.3 密码套件。此版本弃用了 md5 密码身份验证,该验证将在未来的版本中移除。如果您需要基于 PostgreSQL 的密码身份验证,请使用 SCRAM 身份验证。

PostgreSQL 18 还支持通过 postgres_fdw 和 dblink 对远程 PostgreSQL 实例进行 SCRAM 直通身份验证。此外,pgcrypto 现在支持 SHA-2 加密进行密码哈希。

复制(mysql逻辑复制已经非常成熟,5.7支持按事务并行逻辑复制,默认支持所有数据库,没有复制槽问题,2015年)

PostgreSQL 18 支持在日志和 pg_stat_subscription_stats 视图中报告逻辑复制的写入冲突。此外,CREATE SUBSCRIPTION 现在默认使用并行流式传输来应用事务,这可以帮助提高性能。pg_createsubscriber 实用程序现在有一个 --all 标志,因此您可以使用单个命令为实例中的所有数据库创建逻辑副本。

PostgreSQL 18 还允许您自动删除空闲的复制槽,以帮助防止在发布者上存储过多的预写日志文件。

维护和可观察性(vacuum是postgresql最大的硬伤,更新和删除数据后需要执行vaccum清理数据,mysql使用类似oracle的数据结构和mvcc策略,没有旧版本数据维护问题)

PostgreSQL 18 通过在进行常规清理时主动冻结更多页面,改进了其vacuum策略,减少了开销,并在需要积极清理的情况下有所帮助。

PostgreSQL 18 在 EXPLAIN 中添加了更多详细信息,提供了有关查询计划执行的信息,并且自从此版本起,现在在执行 EXPLAIN ANALYZE 时自动显示访问了多少缓冲区(数据存储的基本单位)。此外,EXPLAIN ANALYZE 现在显示在索引扫描期间发生的索引查找次数,并且 EXPLAIN ANALYZE VERBOSE 包括 CPU、WAL 和平均读取统计信息。PostgreSQL 18 在 pg_stat_all_tables 中包含了更多关于清理和相关操作所花费时间的信息,以及每个连接的 I/O 和 WAL 利用情况的统计信息。

其他值得注意的变化

使用 PostgreSQL 18 initdb 初始化的数据库现在默认启用了页面校验和。这可能会影响从非校验和启用的集群升级,这需要您在使用 pg_upgrade 时创建一个带有 --no-data-checksums 选项的新 PostgreSQL 18 集群。

PostgreSQL 18 还引入了一个新版本的 PostgreSQL 线路协议(3.2),这是自 PostgreSQL 7.4(2003)以来的第一个新协议版本。libpq 仍然默认使用版本 3.0,而客户端(例如,驱动程序、池化器、代理)添加了对新协议版本的支持。

其他功能

PostgreSQL 18 还添加了许多其他新功能和改進,这些功能也可能对您的用例有帮助。请参阅发行说明以获取新功能和更改功能的完整列表。

以上功能来自PostgreSQL18发布文档的机器翻译

https://www.postgresql.org/about/news/postgresql-18-released-3142/