我有一个Postgres数据库的PHP Web应用程序,它可以获得大量查询(300-600)。数据库服务器效率不高,因此我的查询超时很多。 是否有任何机制可以在数据库上运行之前创建查询队列? 我认为它是一个proccess / deamon,从队列中获取50个查询,在数据库上运行它们,等待所有完成并获得接下来的50个查询等。
答案 0 :(得分:3)
在数据库
上运行查询队列之前是否有任何机制可以创建查询队列
是 - 事务池模式中的PgBouncer可以对语句进行排队。
尽管如此,您很可能只需要调整数据库服务器并处理性能不佳的查询。查看pg_stat_statements
,auto_explain
,explain analyze
等。阅读the wiki article on connection counts和slow queries。
如果可能的话,修复您的客户端应用程序,使其执行更多工作的查询更少 - 执行设置操作。
对于写入(插入/更新/删除),将它们批处理到事务中,如果可能,运行更少的语句来完成更多工作。特别是,尽可能不要遍历SQL语句。
如果必须使用大量小写,请查看为不太重要的写入设置commit_delay
或(如果可以接受数据丢失窗口)设置synchronous_commit = off
。
如果您的查询主要是读取,我强烈建议您引入中级缓存,例如Redis内存中的键/值存储或Memcached。让您的应用程序管理此缓存,以避免重复获取不必非常新鲜或不会超快速更改的数据。您可以使用PostgreSQL的LISTEN和NOTIFY功能来实现细粒度的缓存失效。