【问题标题】:Slow Postgres queries in ZendZend 中的慢 Postgres 查询
【发布时间】:2012-11-28 20:29:26
【问题描述】:

最近我问是否有某种方法可以让我的查询执行得更快(主题:Slow postgresql queries in Zend)。我摆脱了“描述”查询,这导致了 20-30% 的提升。但我的查询仍然太慢。

class Application_Model_DbTable_Images extends Zend_Db_Table_Abstract
{
    protected $_name = 'images';

    public function getImage($id)
    {
        $row = $this->fetchRow("id = $id");
        return $row;
    }
}

我分析了我的应用程序并注意到单个 getImage() 调用持续大约 300 毫秒。但如果我调用它两次,那么第二次调用会持续大约 15 毫秒。我该怎么做才能使所有查询执行得这么快?

我也 100% 确定不再有描述查询 - 我检查了数据库查询日志,所有查询看起来都很完美。

【问题讨论】:

    标签: php performance zend-framework postgresql


    【解决方案1】:

    听起来它只是在缓存。第一次它必须从磁盘读取信息,第二次它已经在 RAM 中。

    300ms 获取行是否合理 - 您通过 psql 得到什么?

    如果您想了解数据库的性能,您至少需要掌握以下基本知识:

    1. 您在什么硬件上运行,尤其是磁盘 I/O 和寻道时间
    2. 您的查询计划(通过EXPLAIN
    3. 查询中移动了多少数据
    4. 了解您的数据库是否变得臃肿(autovaccum 如果配置得当,应该可以防止这种情况发生)

    【讨论】:

    • 否 - 服务器将缓存磁盘内容,因此当它再次尝试读取磁盘的该部分时,它已经在 RAM 中。
    • 1.这些缓存文件每个只有大约 5kB - file_get_contents() 可以立即处理它们(~1ms)。 2. 单行数据小于2kB。 4.“图像”表包含约 3000 行。我在 pgadmin 中执行了 zend 创建的查询,它们每花费约 15 毫秒。也许每次我的控制器启动时都会初始化一个新连接。如何防止这种情况发生?
    【解决方案2】:

    数据库本身会影响性能,调用代码也会如此。您可能想比较在 ZF 中构建查询的不同方式,看看是否有任何区别。

    当前:

    class Application_Model_DbTable_Images extends Zend_Db_Table_Abstract
    {
        protected $_name = 'images';
    
        public function getImage($id)
        {
            $row = $this->fetchRow("id = $id");
            return $row;
        }
    }
    

    试试:

    class Application_Model_DbTable_Images extends Zend_Db_Table_Abstract
    {
        protected $_name = 'images';
    
        public function getImage($id)
        {
            $select = $this->select()->where('id = ?', $id);//try using the select(), ZF will anyway
            $row = $this->fetchRow($select);
            return $row;
        }
    }
    

    或:

    类 Application_Model_DbTable_Images 扩展 Zend_Db_Table_Abstract { 受保护的 $_name = '图片';

    public function getImage($id)
    {
        $select = $this->select()->where('id = ?', $id);
        $row = $this->fetchAll($select);//maybe a different fetch will have an effect
        return $row;
    }
    

    }

    这里有几个构建查询的不同方法的示例(还有很多),它们可能对您的性能有所帮助,也可能无济于事。

    【讨论】:

      【解决方案3】:

      我所要做的就是启用与我的数据库的持久连接。 here 提供了有关如何执行此操作的说明。

      我不确定它是否安全或高效,但现在我的查询在 20 毫秒而不是数百毫秒内执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-16
        • 1970-01-01
        • 2018-01-23
        相关资源
        最近更新 更多