1

最近我问是否有某种方法可以让我的查询执行得更快(主题:Zend 中的慢 postgresql 查询)。我摆脱了“描述”查询,这导致了 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% 确定不再有描述查询 - 我检查了数据库查询日志,所有查询看起来都很完美。

4

3 回答 3

0

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

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

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

  1. 您正在运行什么硬件,尤其是磁盘 I/O 和寻道时间
  2. 您的查询计划(通过EXPLAIN
  3. 在查询中移动了多少数据
  4. 知道您的数据库是否变得臃肿(如果配置得当, autovaccum应该可以防止这种情况发生)
于 2012-11-27T11:18:04.747 回答
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;
}

}

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

于 2012-11-28T10:01:47.123 回答
0

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

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

于 2012-11-28T12:29:26.937 回答