性能调优

Postgres 性能最佳实践

A powerful Postgres elephant.

作者:Ana Tavares

随着数据量的增长,调整 PostgreSQL 的性能对于提高数据检索效率和速度至关重要,从而改善应用程序的响应速度。

如果您一直为缓慢的 PostgreSQL 查询或整体缓慢的数据库而苦恼,实施一些 PostgreSQL 性能最佳实践将为您带来速度提升,并允许更好地利用系统资源,从而降低运营成本。此外,它还有助于您在高负载下保持系统稳定性,并确保 PostgreSQL 数据库随着时间的推移而增长时的可扩展性。

作为 Timescale 的构建者,它本身就是 PostgreSQL,但速度更快,我们已经在之前的文章中广泛讨论了 PostgreSQL 的性能调优。在本文中,我们将这些有用的资源集中在一个地方,这样您就不必翻阅我们的档案(但如果您想的话,请随意翻阅;您会在途中发现一些珍宝)。为了方便起见,我们将它们分为一般性能建议、查询性能和数据库管理。

Postgres 性能调优系列

在调整 PostgreSQL 数据库时,您需要评估几个影响性能的关键方面,从 CPU 能力或内存和分区,到调整 PostgreSQL 参数,例如 shared_buffersmax_parallel_workers,以及优化索引,仅举几例。

根据您的需求平衡潜在的瓶颈,因为其中一些方面可能会相互影响以及您的数据库性能。让我们快速浏览一下它们。

CPU 和内存大小

正确调整 CPU 和内存大小对于获得最佳的 PostgreSQL 性能至关重要。这是在您的特定工作负载和性能要求的基础上取得平衡。CPU 能力或内存不足会降低数据库速度,而过度配置 CPU 则可能成本过高。

关键参数

如果您在购买新手机后立即更改设置,为什么不也对数据库进行同样操作?PostgreSQL 设置会影响性能,您可以通过移动一些杠杆来获得更多收益。我们在之前的文章中介绍了这些 PostgreSQL 关键参数,包括 max_worker_processesautovacuum_max_workersshared_buffers 等等。

数据库索引

如果您正在处理庞大的数据集,优化数据库索引(一种帮助高效检索数据的机制,就像书籍中的目录)对于提高性能至关重要。

设计数据库模式

数据库模式对于 PostgreSQL 性能至关重要,因为它能够有效地组织数据,实现有效索引,并避免冗余。它还通过在表之间强制执行约束和关系来确保数据完整性。最后,良好的模式有助于查询优化和可扩展性,在不降低性能的情况下管理更大的数据量。

分区设计

最后,拼图的最后一块:分区对于 PostgreSQL 性能至关重要,因为它通过将数据缩小到特定的分区来提高查询速度,从而减少扫描的数据量。它还有助于有效的数据管理,通过将大型表分解成更小、更易于管理的部分,从而提高可扩展性和负载平衡。

提高 Postgres 查询性能

对于 SQL 系统的性能来说,查询设计与数据库设计同样重要。结构良好的查询可以有效地检索数据,最大限度地利用系统资源,而编写的查询不佳会降低性能,即使数据库设计最优也是如此。

传统的数据库设计强调用最少的查询完成最大的工作,但设计和架构决策应该从一开始就侧重于性能优化。查询瓶颈是指查询成为系统中的薄弱点,降低数据检索速度的情况。例如,索引的使用效率低下,导致全表扫描而不是特定数据检索,或者查询会锁定大量数据,阻止其他操作并发执行。

以下是一些提高 Postgres 查询性能的指南和技巧。

Postgres 数据库管理技巧

现在,让我们谈谈数据库管理。想要学习如何确保数据库性能,保证数据完整性和安全性,以及有效地管理数据库以实现可扩展性和效率?我们还有一些 数据库管理技巧

  • 其中一个关键建议是数据规范化,它可以最大限度地减少冗余并增强数据完整性,从而使数据库更高效、更可靠。定期备份与一致的测试相结合,对于保护数据并在系统故障或数据丢失事件发生时确保成功恢复至关重要。

  • 建议积极监控数据库性能,包括性能指标、查询分析和数据库日志,以便尽早发现潜在问题并优化性能。针对未经授权的访问采取安全措施,例如实施用户角色和权限、定期进行安全更新以及遵守最佳实践,对于数据库保护至关重要。

  • 从一开始就规划可扩展性,采用数据分区和索引等技术,对于随着系统扩展而增加的负载和更大的数据集至关重要。编写高效的查询并定期优化它们可以显着提高数据库性能。

  • 使用错误修复、安全补丁和性能改进更新您的数据库管理系统对于维护健壮、安全和高效的数据库环境至关重要。数据库模式、存储过程、触发器和其他元素的全面文档对于高效的数据库管理也是关键。

  • 最后,数据归档和利用数据库缓存机制等策略可以通过减少磁盘 I/O、提高数据检索速度以及将很少访问的数据移动到辅助存储来显著提高性能。

我们知道☝️这需要很多工作,所以如果您想节省时间并专注于您的应用程序而不是您的数据库,请创建一个完全托管的 Timescale 帐户。您可以免费试用 30 天。

PgBouncer

PostgreSQL 连接池管理器管理您的应用程序和数据库之间的连接。连接池管理器会维护一个活动连接池,您的应用程序可以重复使用这些连接,而不是每次您的应用程序需要查询数据库时都创建新的连接。

在 Timescale,我们基于PgBouncer构建了我们的连接池实现,它是一个自称“轻量级 PostgreSQL 连接池器”的工具,因为它是我们社区中许多人广泛使用的工具,并且执行其功能良好——您可以阅读我们关于PgBouncer 的建议

您可能会想,“等等,这与性能有什么关系?” 采用预处理语句可以通过绕过查询解析和分析来显着提高应用程序性能,从而消除大量开销。当与连接池器和事务模式结合使用时,Postgres 数据库的性能可以显着提高——我们在关于使用预处理语句和 PgBouncer 的事务模式提高 Postgres 性能的文章中解释了所有内容。

TimescaleDB 技巧

但是,提高 Postgres 性能的最快方法是创建一个 Timescale 帐户。与 PostgreSQL 相比,TimescaleDB 可以将查询性能提高 1,000 倍或更多,将存储利用率降低 90%,并提供时间序列和分析应用程序必不可少的特性

您可以使用超函数来利用 Timescale 进行数据分析,这是一组针对时间序列查询、聚合和分析进行了优化的函数、过程和数据类型。如果您想检查它们的有效性,请阅读我们关于迄今为止最大规模的内部测试的文章,其中我们使用超函数来分析和聚合我们运行中的生产数据库群的查询信息。

虽然我们在这里收集的大多数文章都包含一些 Timescale 特定的技巧,但我们也提供了一个简化的版本,以简化您的生活,其中包含您应该了解(并调整)以最大限度地提高性能的 Timescale 参数。如果您发现其中一些与我们的一般 Postgres 建议重叠,那是因为 Timescale 是 PostgreSQL,但速度更快。

祝您性能调整愉快!