【发布时间】:2014-02-09 10:12:21
【问题描述】:
我有一个 PHP Web 应用程序,它是 Postgres 数据库,每秒可获取大量查询 (300-600)。数据库服务器效率不高,所以我得到很多查询超时。 在数据库上运行查询之前,是否有任何机制可以使查询排队? 我将其视为一个进程/守护进程,它从队列中获取 50 个查询,在数据库上运行它们,等待所有人完成并获取下一个 50 个查询,等等。
【问题讨论】:
标签: php queue postgresql-9.2
我有一个 PHP Web 应用程序,它是 Postgres 数据库,每秒可获取大量查询 (300-600)。数据库服务器效率不高,所以我得到很多查询超时。 在数据库上运行查询之前,是否有任何机制可以使查询排队? 我将其视为一个进程/守护进程,它从队列中获取 50 个查询,在数据库上运行它们,等待所有人完成并获取下一个 50 个查询,等等。
【问题讨论】:
标签: php queue postgresql-9.2
在数据库上运行查询之前,是否有任何机制可以使查询排队
是的 - 事务池模式中的PgBouncer 可以将语句排队。
不过,您很可能只需要调整数据库服务器并处理性能不佳的查询。查看pg_stat_statements、auto_explain、explain analyze 等。阅读the wiki article on connection counts 和slow queries。
如果可能,请修复您的客户端应用程序,使其执行更少的查询,而每个查询执行更多的工作 - 执行 set 操作。
对于写入(插入/更新/删除),将它们批处理到事务中,并尽可能运行更少的语句来完成更多的工作。特别是,尽可能不要循环 SQL 语句。
如果您必须使用大量小写入,请查看设置 commit_delay 或(如果您可以接受数据丢失窗口)设置 synchronous_commit = off 用于不太重要的写入。
如果您的查询主要是读取,我强烈建议引入中级缓存,例如 Redis 内存键/值存储或 Memcached。让您的应用程序管理此缓存以避免重复获取不必完全新鲜或更改速度不快的数据。您可以使用 PostgreSQL 的 LISTEN 和 NOTIFY 功能来实现细粒度的缓存失效。
【讨论】:
max_connections 等关键参数、您的应用正在执行的任务的描述、该任务的触发方式、您对结果的处理方式等。