作者: 北枫
本文将分别从以下两个方面给出提升插入性能的建议:
一提升PostgreSQL性能
二选择并配置TSDB以获得更好的插入性能
其中一些方法可能会让您感到比较新奇,但所有十二种方法都将帮助您在使用PostgreSQL和TSDB时提升写入性能。
写入性能对于许多常见的PostgreSQL使用案例至关重要,包括应用程序监控、应用程序分析、物联网监控等。虽然数据库早就应用于时间序列领域,但与这些用例使用数据类型有一个关键区别:与标准的关系“业务”数据不同,更多的场景数据更新被视为插入,而不是覆盖(换句话说,每个新值都成为数据库中的一个新行,而不是用最新值替换该行的先前值)。
如果您在一个需要保留所有数据的场景中运行,而不是覆盖过去的值,优化数据库写入性能变得至关重要。
以下,我概述了一些对改进PostgreSQL性能非常有用的技巧。之后,概述了一些特定于TSDB插入性能的相关建议。
一. 提升PostgreSQL性能
下面是一些在PostgreSQL中提升数据插入性能的测试结论:
1.合理使用索引
拥有合适的索引可以加快查询速度,但也不是绝对的。以增量方式维护每一新行的索引需要额外的工作。检查您在表上定义的索引数(使用psql命令\d table),并确定索引带来的性能提升是否大于存储和插入所用开销。由于每个系统都是不同的,因此对于索引的规则没有绝对的统一标准——只要合理就行。
2.慎重使用外键约束
有时需要从一个表到其他关系表构建外键(FK)。当存在外键约束时,每个INSERT通常都需要从引用的表中读取数据,这会降低性能。考虑一下是否可以对数据进行非规范化处理——我们有时会看到约束的使用非常泛滥,应该要合理地使用。
3.避免使用不必要的唯一约束
开发人员通常都习惯在数据库表中指定主键,许多orm框架也都支持使用这些主键。然而,许多场景(包括常见的监控或时间序列应用程序)并不需要它们,因为每个事件或设备读取都可以简单地记录为一个单独的事件,方法是在写入时将其插入超表当前块的尾部。
如果另外定义了唯一约束,则该插入可能需要索引查找来确定行是否已经存在,这将增加额外的开销,影响写入的速度。
4.对预写日志(WAL)和数据使用单独的磁盘
虽然有时候这是一个并不总是需要的更高级的优化,但是如果磁盘成为瓶颈,您可以通过为数据库的预写日志(WAL)和数据使用单独的磁盘(表空间)来进一步提高吞吐量。
5.使用高性能磁盘
有时开发人员会在低性能磁盘的环境中部署数据库,无论是由于性能较差的HDD、远程SAN还是其他类型的存储配置。因为在插入行时,数据会在事务完成之前持久化地存储到预写日志&