登陆

Postgres被轻视了它处理的内容超出您的幻想

admin 2019-12-04 156人围观 ,发现0个评论

一分钟时间再三考虑。很有可能从现有的Postgres数据库中获得更多收益。它可以扩展以应对重载,并提供乍一看并不明显的强大功能。例如,可以启用内存中缓存,文本搜索,专用索引和键值存储。

阅读本文之后,您可能想从数据存储中列出所需的功能,并检查Postgres是否适合它们。它对于大多数应用程序来说足够强大。

为什么添加另一个数据存储并不总是一个好主意

正如弗雷德布鲁克斯(Fred Brooks)请假条怎么写在《神话人月》中所说的那样:“程序员,就像诗人一样,只需要从纯粹的思想中移除一点。[他们]凭空发挥想象力,在空中,空中建造城堡。”

为这些城堡增加更多的零件,并迷失在设计中,这是无穷的魅力。但是,在现实世界中,空中建造更多的城堡会妨碍您的前进。数据存储中的最新炒作也是如此。选择无聊的技术有几个优点:

  • 如果有新人加入您的团队,他们可以轻松地理解您的不同数据存储吗?
  • 一年后,当您或另一个团队成员回来时,他们是否可以迅速掌握系统的工作原理?
  • 如果您需要更改系统或添加功能,则需要移动几块?
  • 您是否考虑了维护成本,安全性和升级?
  • 在大规模生产中运行新数据存储时,您是否考虑了未知和失败模式?

尽管可以通过周到的设计进行管理,但是添加多个数据存储确实会增加复杂性。在探索添加其他数据存储之前,值得研究一下现有数据存储可以为您提供哪些附加功能。

Postgres鲜为人知但功能强大的功能

许多人没有意识到Postgres提供的不仅仅是SQL数据库。如果堆栈中已经有Postgres,为什么在Postgres可以完成这项工作时又添加更多的零件?

Postgres高速缓存

有一个误解,认为Postgres在每个查询中都从磁盘读取和写入数据,尤其是当用户将其与像Redis这样的纯内存数据存储区进行比较时。

实际上,Postgres有一个设计精美的缓存系统,其中包含页面,使用计数和事务日志。您的大多数查询都不需要访问磁盘,尤其是当它们反复查询相同的数据时(尤其是许多查询倾向于这样做)。

Postgres配置文件中的shared_buffer配置参数确定它将用于缓存数据的内存量。通常,应将其设置为总内存的25%到40%。这是因为Postgres还将操作系统缓存用于其操作。有了更多的内存,大多数引用相同数据集的重复查询将不需要访问磁盘。您可以通过以下方法在Postgres CLI中设置此参数:

ALTER SYSTEM SET shared_buffer TO = 

诸如Heroku之类的托管数据库服务提供了几种计划,其中RAM(以及缓存)是主要区别。免费的业余版本不提供诸如RAM之类的专用资源。准备好承受生产负荷时进行升级,以便可以更好地利用缓存Postgres被轻视了它处理的内容超出您的幻想。

您还可以使用一些更高级的缓存工具。例如,检查pg_buffercache视图以查看正在占用您实例的共享缓冲区缓存的内容。另一个要使用的工具是pg_prewarm函数,它是基础安装的一部分。此功能使DBA可以将表数据加载到操作系统缓存或Postgres缓冲区缓存中。该过程可以是手动或自动的。如果您知道数据库查询的性质,则可以大大提高应用程序性能。

对于真正勇敢的人,请参阅本文以深入了解Postgres缓存。

扩展Postgres的技巧

如果出于性能原因考虑关闭Postgres,请首先查看使用它提供的优化可以达到的程度。在这里,我们假设您已经完成了基础工作,例如创建适当的索引。Postgres提供了许多高级功能,尽管更改很小,但可以带来很大的不同,特别是如果它使您避免基础架构复杂化。

不要过度索引

避免不必要的索Postgres被轻视了它处理的内容超出您的幻想引。谨慎使用多列索引。过多的索引占用了额外的内存,从而无法更好地利用Postgres缓存,这对性能至关重要。

使用这样的工具EXPLAIN ANALYZE可能会使查询计划程序实际选择顺序表扫描的频率使您感到惊讶。由于表的许多行数据已被缓存,因此通常甚至不使用这些复杂的索引。

就是说,如果您发现查询速度慢,第一个也是最明显的解决方案是查看表是否缺少索引。索引至关重要,但是您必须正确使用它们。

了解Postgres索引类型

为数据选择正确的索引可以提高性能。以下是一些常见的索引类型以及何时应使用每种索引类型。

  • B树索引

B树索引是用于有效排序数据的二叉树。如果使用该INDEX命令,它们是默认值。大多数时候,B树索引就足够了。在扩展时,不一致可能是一个更大的问题,因此请定期使用amchecPostgres被轻视了它处理的内容超出您的幻想k扩展名。

  • BRIN指数

当表格自然已经按列排序时,可以使用块范围索引(BRIN),而您需要按该列排序。例如,对于顺序写入的日志表,在timestamp列上设置BRIN索引可让服务器知道数据已被排序。

  • 布隆过滤器指数

Bloom索引非常适合只需要测试相等性的大表上的多列查询。它使用一种称为布隆过滤器的特殊数学结构,该结构基于概率并且使用的空间大大减少。

  • GIN和GiST索引

将GIN或GiST索引用于基于复合值(例如文本,数组和JSON)的有效索引。

繁重的实时处理

如果您遇到许多发布事件,工作和数十名工作人员需要协调的情况,则可能需要像Apache Kafka这样更专业的解决方案。LinkedIn工程师最初是开发Kafka来处理新的用户事件,例如单击,邀请和消息,并允许不同的工作人员处理消息传递和作业来处理数据。

即时全文搜索

如果您的实时应用程序负载繁重,一次要进行十次以上的搜索,并且需要自动完成等功能,那么您可能会从Elasticsearch这样的专用文本解决方案中受益匪浅。

结论

Redis,Elasticsearch和Kafka功能强大,但是有时添加它们弊大于利。您可以利用我们这里介绍的鲜为人知的功能来获得Postgres所需的功能。确保充分利用Postgres可以节省您的时间,并有助于避免增加复杂性和风险。

为了节省更多时间和头痛,请考虑使用诸如Heroku Postgres之类的托管服务。扩大规模很简单,只需添加其他关注者副本即可,只需单击即可打开高可用性,Heroku会为您进行操作。如果您确实需要扩展到Postgres之外,那么我们上面提到的其他数据存储(例如Redis,Apache Kafka和Elasticsearch)都可以在Heroku上轻松配置。继续并在空中建造您的城堡-但将它们固定在可靠的基础上,这样您就可以梦想获得更好的产品和客户体验。

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP