海外主机测评

您现在的位置是:首页 > 数据库 > 正文

数据库

如何提高PostgreSQL数据库的性能?

cds8202023-08-07数据库89
PostgreSQL,也称为Postgres,是一个功能丰富且功能强大的开源关系数据库管理系统(RDBMS)。与任何数据库系统一样,遵循最佳实践对于实现最佳性能、数据完整性和可扩展性至关重要。那么如

PostgreSQL,也称为Postgres,是一个功能丰富且功能强大的开源关系数据库管理系统(RDBMS)。与任何数据库系统一样,遵循最佳实践对于实现最佳性能、数据完整性和可扩展性至关重要。那么如何提高的性能?



以下是提高PostgreSQL数据库性能的一些技巧:

1、适度使用索引

拥有正确的索引可以加快查询速度,增量维护每个新行的索引需要额外的工作。检查我们在表上定义的索引数量(使用psql命令\d table_name),并确定它们的潜在查询优势是否超过存储和插入开销。 由于每个系统都是不同的,因此没有任何硬性规定或索引的“神奇数字”——只要合理即可。


2、重新考虑外键约束

有时需要建立从一个表到其他关系表的外键(FK)。当我们有FK约束时,每个INSERT通常都需要从引用的表中读取数据,这会降低性能。 考虑一下是否可以对数据进行非规范化——我们有时会看到相当极端地使用FK约束,这是出于“优雅”的感觉而不是工程权衡。


3、避免不必要的UNIQUE键

开发人员经常接受培训以指定数据库表中的主键,许多ORM都喜欢它们。然而,许多用例(包括常见的监控或时间序列应用程序)不需要它们,因为每个事件或传感器读数都可以通过在写入时将其插入到超表当前块的尾部来简单地记录为单独的事件。

如果以其他方式定义了UNIQUE约束,则该插入可能需要进行索引查找来确定该行是否已存在,这将对INSERT的速度产生不利影响。


4、WAL和数据使用单独的磁盘

虽然这是一种并不总是需要的更高级的优化,但如果我们的磁盘成为瓶颈,我们可以通过为数据库的预写日志(WAL)和数据使用单独的磁盘(表空间)来进一步提高吞吐量。


5、使用高性能磁盘

有时,开发人员会将数据库部署在磁盘速度较慢的环境中,无论是由于HDD、远程SAN还是其他类型的配置性能不佳。而且,由于在插入行时,数据会在事务完成之前持久存储到预写日志(WAL),因此缓慢的磁盘会影响插入性能。 


6、使用并行写入。

在PostgreSQL的每个INSERT或COPY命令都作为单个事务执行,因此以单线程方式运行。为了实现更高的摄取量,我们应该并行执行多个 INSERTS或COPY命令。


7、批量插入行。

为了实现更高的摄取率,我们应该在每个INSERT调用中插入多行数据(或者使用一些批量插入命令,例如COPY或我们的并行复制工具)。

不要逐行插入数据--而是尝试每次插入至少数百(或数千)行。这使得数据库可以花更少的时间在连接管理、事务开销、SQL解析等上,而将更多的时间花在数据处理上。


8、正确配置shared_buffers

我们通常建议使用25%的可用RAM。如果我们通过运行的方法安装, 它应该自动配置shared_buffers为适合我们的硬件规格的内容。


9、在Linux主机上运行我们的Docker镜像

如果我们在另一个Linux操作系统之上运行Docker容器(运行Linux),那么我们的状态就很好。容器基本上提供进程隔离,并且开销极小。


10、以松散的时间顺序写入数据

当块的大小适当时,最新的块及其关联的索引自然会保留在内存中。插入最近时间戳的新行将被写入内存中已有的这些块和索引中。

如果插入具有足够旧时间戳的行(即,这是无序或回填写入),则需要从磁盘读入与旧块(及其索引)相对应的磁盘页面。这将显着增加写入延迟并降低插入吞吐量。


11、避免“太大”的块

为了保持较高的摄取率,我们希望最新的块及其所有关联的索引保留在内存中,以便写入块和索引更新仅更新内存。(写入仍然是持久的,因为在更新数据库页面之前将插入写入磁盘上的WAL。)

如果我们的块太大,那么即使是最新的块的写入也将开始交换到磁盘。

根据经验,建议最新的块及其所有索引都适合数据库的共享缓冲区。 您可以通过 chunk_relatiON_size_pretty SQL 命令检查块大小。

如果块太大,可以通过 set_chunk_time_interval 命令更新未来块的范围。然而,这不会修改现有块的范围(例如,通过将大块重写为多个小块)。


以上就是提高高PostgreSQL数据库性能的一些技巧,希望能帮助到大家!

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~