提高 PostgreSQL 插入性能的 5 个技巧

推荐这五种最佳实践,以提高虚构 PostgreSQL 的插入性能:

1.适度使用索引
拥有正确的索引可以加快查询速度,但它们并不是灵丹妙药。为每条新记录增量维护索引需要额外的工作。检查你在表上定义的索引数量(使用 psql 命令 \d table_name),并确定它们的潜在查询优势是否大于存储和插入开销。由于每个系统都不尽相同,因此没有任何硬性规定或索引的 "神奇数量",只要合理即可。

2.重新考虑外键约束
有时,有必要建立从一个表到其他关系表的外键(FK)。有外键约束时,每次 INSERT 通常都需要从引用表中读取数据,这会降低性能。考虑对数据进行去规范化处理--我们有时会看到,出于 "优雅 "的考虑而非工程上的权衡,FK 约束的使用非常极端。

3.避免不必要的 UNIQUE 键
开发人员经常被训练在数据库表中指定主键,许多 ORM 也喜欢主键。然而,许多用例(包括常见的监控或时间序列应用)并不需要主键,因为每个事件或传感器读数都可以作为单独的事件记录下来,只需在写入时将其插入 hypertable 当前数据块的尾部即可。

如果另外定义了 UNIQUE 约束,插入时就必须查找索引,以确定记录是否已经存在,这将对 INSERT 的速度产生不利影响。

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

5.使用性能良好的磁盘
有时,开发人员会在磁盘速度较慢的环境中部署数据库,这可能是由于硬盘性能较差、远程存储区域网络(SAN)或其他类型的配置造成的。由于插入行时,数据会在事务完成前持久地存储在 WAL 中,因此磁盘速度慢会影响插入性能。要做的一件事就是使用 ioping 命令检查磁盘 IOPS:
读测试:
ioping -q -c 10 -s 8k .
写测试:
ioping -q -c 10 -s 8k -W .