Zend Framework中有很多DESCRIBE查询

时间:2010-02-09 15:51:57

标签: php zend-framework query-optimization

我刚刚在Zend中设置了FirePHP,我注意到大量的DESCRIBE查询。某些页面在同一个表上有50个或更多相同的查询。 e.g。

0.00198     connect      NULL
0.00449 DESCRIBE `nodes`    NULL
0.00041 SELECT `nodes`.* FROM `nodes` WHERE (((`nodes`.`id` = 111)))    NULL
0.0037  DESCRIBE `nodes`    NULL
0.00155 SELECT `nodes`.* FROM `nodes` WHERE (((`nodes`.`id` = 111)))    NULL
0.00059 SELECT `nodes`.* FROM `nodes` WHERE (parent_id = '111') ORDER BY `order` ASC, `id` ASC  NULL
0.00366 DESCRIBE `nodes`    NULL
0.0054  DESCRIBE `nodes`    NULL
0.0049  DESCRIBE `nodes`    NULL
0.00519 DESCRIBE `nodes`    NULL
0.00492 DESCRIBE `nodes`    NULL
0.00691 DESCRIBE `nodes`    NULL
0.00741 DESCRIBE `nodes`    NULL
0.0048  DESCRIBE `nodes`    NULL
0.00556 DESCRIBE `nodes`    NULL
0.00516 DESCRIBE `nodes`    NULL
0.00487 DESCRIBE `nodes`    NULL

......它继续。

框架是否生成了所有那些DESCRIBE查询(我使用的是Zend_DbTable)?这些都是必要的吗?我应该担心它们还是不太可能影响性能?

3 个答案:

答案 0 :(得分:13)

这些查询由Zend_Db_Table执行以检测表的模式。您可以要求Zend_Db_Table使用Zend_Cache缓存结果以防止持续调用,但如果您更改架构,请记住这一点。

您可以使用以下方式执行此操作:

Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);

答案 1 :(得分:3)

Zend_Db_Adapter_Abstract::describeTable()执行这些查询以在使用Zend_Db_Table时获取表的元数据。例如,当您未明确指定主键时,将使用此查询。您可以启用MetaData缓存,或只使用Zend_Db代替Zend_Db_Table

认为你不应该有这么多的描述查询。设置Zend_Db_Table实例后,它将在第一次查询剩余请求后存储元数据。尝试使用Zend_Debugger或Xdebug来找出导致这种情况的原因。

答案 2 :(得分:3)

我使用单例模式将Zend_DbTable实例存储在基础模型类的静态数组中。这会将每次请求的数据库查询减少到一个,这对我来说足够好,并且还减少了需要实例化的对象数量。

例如:

protected $_dbTable;
protected $_table; //override the database table name in subclass

private static $_dbTableCache = array();

public function __construct()
{
    $this->_dbTable = $this->getDbTableInstance($this->_table);
}

protected function getDbTableInstance($tableName) {
    if (self::$_dbTableCache[$tableName] === null) {
        self::$_dbTableCache[$tableName] = new Zend_Db_Table($tableName);
    }
    return self::$_dbTableCache[$tableName];
}