2014-02-09 80 views
0

我得到一个PHP的Web应用程序,其中Postgres数据库,其中获取大量的查询第二(300-600)。数据库服务器效率不高,所以我得到很多查询超时。 是否有任何机制会在数据库上运行它们之前创建查询队列? 我认为这是下面的一个进程/守护进程这需要即50个查询从队列,运行这些数据库,等待所有完成并获得下一个50个查询等PostgreSQL数据库查询队列mechanizm(PHP)

回答

3

是否有任何机制,以使一个查询在交易池模式可以排队发言PgBouncer - 运行它们的数据库

是前排队。

尽管您很可能只需要调整数据库服务器并处理性能不佳的查询。退房pg_stat_statements,auto_explain,explain analyze等。请阅读the wiki article on connection countsslow queries

如果可能的话,修复您的客户端应用程序,以便减少每个执行更多工作的查询 - 执行设置操作

对于写入操作(插入/更新/删除)将它们批量处理成事务,并且如果可能的话,运行更少的语句来执行更多的工作。特别是,不要在可能的情况下遍历SQL语句。

如果必须使用大量的小写的,看设置commit_delay或者(如果你能接受的数据丢失窗口)设置为synchronous_commit = off不太重要的写操作。

如果您的查询主要是读取,我强烈建议引入一个像Redis内存中键/值存储或Memcached的中级缓存。让您的应用程序管理此缓存,以避免重复获取不一定非常新鲜的数据,或者速度不会超快。您可以使用PostgreSQL的LISTEN和NOTIFY功能来实现细粒度缓存失效。

+0

感谢您的回复。 我刚刚发现这个: http://kr.github.io/beanstalkd/ 是否有人用它将查询排入数据库?这是个好主意吗?文档很差。 –

+0

@ZiomZiomalski如果你正在寻找一个实际的排队系统,对于消息队列来看看ZeroMQ,ActiveMQ,Celery等等等等等等等。不太清楚任务队列,我不需要处理它们,但是看到http: //queues.io/。另外,请阅读http://mikehadlow.blogspot.com.au/2012/04/database-as-queue-anti-pattern.html。 –

+0

@ZiomZiomalski另外,考虑发布一个更好的框架问题:“这是我的应用程序所做的,这里是它运行的查询,这是为什么它这样做,这是它导致的性能问题,还有更好的方法吗?”。包括PostgreSQL版本,像max_connections这样的关键参数,你的应用正在执行的任务的描述,如何触发这个任务,你对结果做什么等。 –