我刚刚在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)?这些都是必要的吗?我应该担心它们还是不太可能影响性能?
答案 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];
}