Zend中的慢Postgres查询

时间:2012-11-27 10:10:58

标签: php performance zend-framework postgresql

最近我问是否有某种方法可以让我的查询执行得更快(主题: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()调用持续约300ms。但如果我把它叫两次,那么第二次通话大约持续15ms。我该怎么做才能使所有查询执行得那么快?

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

3 个答案:

答案 0 :(得分:0)

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

获取行是否合理300毫秒 - 你通过psql获得了什么?

如果您想了解数据库的性能,您至少需要掌握以下内容:

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

答案 1 :(得分:0)

尽管数据库本身可以影响性能,但调用代码也是如此。您可能希望比较在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 {     protected $ _name ='images';

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

}

以下是构建查询的不同方法的几个示例(还有更多),它们可能会或可能不会帮助您提高性能。

答案 2 :(得分:0)

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

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