我正在设置一个带有 FreeBSD PostgreSQL 后端的 Web 应用程序。我正在寻找一些数据库性能优化工具/技术。

有帮助吗?

解决方案

普格富因 对我来说效果很好。看起来有一个 FreeBSD 端口 为了它。

其他提示

数据库优化通常是两件事的结合

  1. 减少对数据库的查询次数
  2. 减少回答查询时需要查看的数据量

减少查询量通常是通过缓存非易失性/不太重要的数据(例如“哪些用户在线”或“该用户的最新帖子是什么?”)在应用程序内部(如果可能)或在外部(更高效)数据存储(memcached、redis 等)中。如果您有需要大量写入的信息(例如命中计数器)并且不需要 -语义上,您还可以考虑将其从 Postgres 数据库移至更高效的数据存储中。

优化查询运行时更加棘手 - 这可能相当于创建 特殊索引 (或者 索引放在首位),更改(可能非规范化)数据模型或更改应用程序在使用数据库时所采用的基本方法。例如,参见 以 Postgres 方式完成分页 谈话 马库斯·维南德 关于如何重新思考分页概念以提高数据库效率

以缓慢的方式测量查询

但要了解应该首先查看哪些查询,您需要知道它们的执行频率以及平均运行时间。

一种方法是记录所有(或“慢速”)查询,包括其运行时间,然后解析查询日志。一个很好的工具是 pgfouine 在本讨论的前面已经提到过,它已被替换为 pgbadger 它是用更友好的语言编写的,速度更快,维护也更积极。

两个都 pgfouinepgbadger 他们需要启用查询日志记录,这可能会对数据库造成明显的性能影响,或者给您带来磁盘空间问题,而且使用该工具解析日志可能需要相当长的时间,而且不会为您提供有关数据库中正在发生的情况的最新见解。

通过扩展加速

为了解决这些缺点,现在有两个扩展可以直接在数据库中跟踪查询性能 - pg_stat_statements (仅在 9.2 或更高版本中有用)和 pg_stat_plans. 。这两个扩展都提供相同的基本功能 - 跟踪给定的“规范化查询”(查询字符串减去所有表达式文字)的运行频率以及总共花费了多长时间。由于这是在查询实际运行时完成的,因此这是以非常有效的方式完成的,因此在综合基准测试中可测量的开销低于 5%。

理解数据

从信息角度来看,查询列表本身非常“干燥”。第三个扩展正在努力解决这个问题,并提供更好的数据表示,称为 pg_statsinfo (随着 pg_stats_reporter),但是要启动并运行它是一项艰巨的任务。

为了为这个问题提供更方便的解决方案,我开始致力于一个商业项目,该项目的重点是 pg_stat_statementspg_stat_plans 并增强从数据库中提取的许多其他数据收集的信息。它被称为 pganalyze 你可以在以下位置找到它: https://pganalyze.com/.

为了提供 Postgres 监控领域中有趣的工具和项目的简要概述,我还开始在 Postgres 维基 定期更新。

我用过一点 pgtop。这很粗糙,但至少我可以看到每个进程 ID 正在运行哪个查询。

我尝试过 pgfouine,但如果我记得的话,它是一个离线工具。

我还跟踪 psql.log 文件并将日志记录标准设置为可以看到问题查询的级别。

#log_min_duration_statement = -1        # -1 is disabled, 0 logs all statements
                                        # and their durations, > 0 logs only
                                        # statements running at least this time.

我还使用 EMS Postgres Manager 来执行一般管理工作。它不会为您做任何事情,但它确实使大多数任务变得更容易,并使审查和设置您的架构变得更加简单。我发现使用 GUI 时,我更容易发现不一致之处(例如缺少索引、字段标准等)。它只是我愿意在 Mac 上使用 VMWare 的两个程序之一。

Munin 非常简单但有效,可以获取数据库随时间演变和执行的趋势。在 Munin 的标准套件中,您可以监控数据库的大小、锁的数量、连接的数量、顺序扫描、事务日志的大小和长时间运行的查询。

易于设置和入门,如果需要,您可以轻松编写自己的插件。

在此处查看 Munin 附带的最新 postgresql 插件:

http://munin-monitoring.org/browser/branches/1.4-stable/plugins/node.d/

好吧,要做的第一件事是使用“explain”尝试 psql 中的所有查询,看看是否有顺序扫描可以通过添加索引或重写查询来转换为索引扫描。

除此之外,我和你一样对这个问题的答案感兴趣。

查看 Lightning Admin,它有一个用于捕获日志语句的 GUI,并不完美,但可以满足大多数需求。 http://www.amsoftwaredesign.com

DB金枪鱼 http://www.dbtuna.com/postgresql_monitor.php 最近开始支持 PostgreSQL 监控。我们广泛使用它来监控 MySQL,因此如果它为 Postgres 提供相同的功能,那么它也应该很适合您。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top