我正在设置一个带有 FreeBSD PostgreSQL 后端的 Web 应用程序。我正在寻找一些数据库性能优化工具/技术。
7 回答
数据库优化通常是两件事的结合
- 减少对数据库的查询次数
- 减少回答查询需要查看的数据量
减少查询量通常通过在应用程序内部(如果可能)或外部缓存非易失性/不太重要的数据(例如“哪些用户在线”或“该用户的最新帖子是什么?”)来完成 -更高效 - 数据存储(memcached、redis 等)。如果您有大量写入的信息(例如命中计数器)并且不需要ACID语义,您还可以考虑将其从 Postgres 数据库中移出到更高效的数据存储中。
优化查询运行时更加棘手 - 这可能相当于创建特殊索引(或首先创建索引),更改(可能是非规范化)数据模型或更改应用程序在使用数据库时采用的基本方法。例如,参见Markus Winand的Pagination done the Postgres way talk关于如何重新思考分页的概念以提高数据库效率
以慢速测量查询
但是要了解应该首先查看哪些查询,您需要知道它们执行的频率以及它们平均运行的时间。
一种方法是记录所有(或“慢”)查询,包括它们的运行时,然后解析查询日志。一个很好的工具是pgfouine
在前面的讨论中已经提到的,它已经被用pgbadger
更友好的语言编写的,更快和更积极地维护的工具所取代。
两者都pgfouine
受到pgbadger
他们需要启用查询日志记录这一事实的影响,这可能会对数据库造成明显的性能影响,或者除了使用该工具解析日志可能需要相当长的时间并赢得胜利之外,还会让您陷入磁盘空间问题不会为您提供有关数据库中正在发生的事情的最新见解。
通过扩展加快速度
为了解决这些缺点,现在有两个扩展可以直接在数据库中跟踪查询性能 - pg_stat_statements
(仅在 9.2 或更高版本中有用)和pg_stat_plans
. 两个扩展都提供相同的基本功能 - 跟踪给定的“规范化查询”(查询字符串减去所有表达式文字)的运行频率以及总共花费了多长时间。由于这是在查询实际运行时完成的,这是以非常有效的方式完成的,因此在综合基准测试中可测量的开销不到 5%。
理解数据
从信息的角度来看,查询列表本身非常“枯燥”。第三个扩展的工作试图解决这个事实并提供更好的数据表示pg_statsinfo
(连同pg_stats_reporter
),但要启动和运行它是一项艰巨的任务。
为了给这个问题提供一个更方便的解决方案,我开始从事一个商业项目,该项目专注于pg_stat_statements
并pg_stat_plans
增强从数据库中提取的许多其他数据收集的信息。它被称为pganalyze
,您可以在https://pganalyze.com/找到它。
为了简要概述 Postgres 监控区域中有趣的工具和项目,我还开始在Postgres Wiki上编译一个列表,该列表会定期更新。
pgfouine对我来说效果很好。看起来它有一个FreeBSD 端口。
我用过一点 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/
嗯,首先要做的是使用“解释”尝试所有来自 psql 的查询,看看是否有顺序扫描可以通过添加索引或重写查询转换为索引扫描。
除此之外,我和你一样对这个问题的答案感兴趣。
查看 Lightning Admin,它有一个用于捕获日志语句的 GUI,虽然并不完美,但可以很好地满足大多数需求。 http://www.amsoftwaredesign.com
DBTuna http://www.dbtuna.com/postgresql_monitor.php最近开始支持 PostgreSQL 监控。我们将它广泛用于 MySQL 监控,所以如果它为 Postgres 提供相同的功能,那么它也应该适合您。