2012-11-27 38 views
1

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

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%确定没有描述查询了 - 我查看了数据库查询日志,所有查询看起来都很完美。

回答

0

我只需要启用持久连接与我的数据库。 有关如何做到这一点的解释可用here

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

0

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

300ms是否适合用于获取行 - 您通过psql获得了什么?

如果你想了解你的数据库的性能,你需要有至少一个基本的把握:您正在运行在什么样的硬件

  1. ,特别是磁盘I/O和寻道时间
  2. 查询计划(通过EXPLAIN
  3. 多少数据查询中移动约
  4. 了解你的数据库变得臃肿(autovaccum应防止这一点,如果适当配置)
+0

否 - 服务器将缓存磁盘内容,因此当它试图再次读取该磁盘部分时,它已经在RAM中。 –

+0

1.这些缓存文件每个仅约5kB - file_get_contents()立即处理它们(〜1ms)。2.单行少于2kB的数据。 4.'images'表包含〜3000行。 我执行了由zend在pgadmin中创建的查询,他们花费了每个〜15ms。也许每次我的控制器启动时都会初始化一个新的连接。我如何防止这种情况发生? – jacek11

+0

那么......任何想法? – jacek11

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 { 保护$ _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; 
} 

}

以下几个不同的方法来构建查询的例子(还有更多),他们可能会或可能不会帮助你的表现。