【问题标题】:PostgreSQL database queries queue mechanizm (PHP)PostgreSQL 数据库查询队列机制 (PHP)
【发布时间】:2014-02-09 10:12:21
【问题描述】:

我有一个 PHP Web 应用程序,它是 Postgres 数据库,每秒可获取大量查询 (300-600)。数据库服务器效率不高,所以我得到很多查询超时。 在数据库上运行查询之前,是否有任何机制可以使查询排队? 我将其视为一个进程/守护进程,它从队列中获取 50 个查询,在数据库上运行它们,等待所有人完成并获取下一个 50 个查询,等等。

【问题讨论】:

    标签: php queue postgresql-9.2


    【解决方案1】:

    在数据库上运行查询之前,是否有任何机制可以使查询排队

    是的 - 事务池模式中的PgBouncer 可以将语句排队。

    不过,您很可能只需要调整数据库服务器并处理性能不佳的查询。查看pg_stat_statementsauto_explainexplain analyze 等。阅读the wiki article on connection countsslow queries

    如果可能,请修复您的客户端应用程序,使其执行更少的查询,而每个查询执行更多的工作 - 执行 set 操作

    对于写入(插入/更新/删除),将它们批处理到事务中,并尽可能运行更少的语句来完成更多的工作。特别是,尽可能不要循环 SQL 语句。

    如果您必须使用大量小写入,请查看设置 commit_delay 或(如果您可以接受数据丢失窗口)设置 synchronous_commit = off 用于不太重要的写入。

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

    【讨论】:

    • 感谢您的回复。我刚刚发现这个:kr.github.io/beanstalkd 有没有人用它来对数据库的查询进行排队?这是个好主意吗?文档很差。
    • @ZiomZiomalski 如果您正在寻找一个实际的队列系统,对于消息队列,请查看 ZeroMQ、ActiveMQ、Celery 等。对任务队列不太确定,我不需要处理与他们一起,但请参阅queues.io。另外,请阅读mikehadlow.blogspot.com.au/2012/04/…
    • @ZiomZiomalski 另外,考虑发布一个更好的框架新问题:“这是我的应用程序所做的,这是它运行的查询,这就是它这样做的原因,这是它导致的性能问题,是否存在更好的方法?”。包括 PostgreSQL 版本、max_connections 等关键参数、您的应用正在执行的任务的描述、该任务的触发方式、您对结果的处理方式等。
    • 感谢您的建议。我的服务器管理员查看了这个问题,他们认为这可能是 I/O 磁盘操作的“硬件”问题。磁盘使用 iSCSI 协议连接,它们之间的带宽似乎达到了极限。不过我会尝试实现消息队列。
    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2015-11-28
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多