Birçok Zend Framework DESCRIBE sorguları

3 Cevap php

Ben sadece Zend FirePHP kurmak ve ben DESCRIBE sorguları çok sayıda fark ediyorum. Bazı sayfalar aynı tabloda 50 veya daha fazla özdeş sorgular hepsi var. örneğin

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

... Ve devam ediyor.

Tüm bu (ben Zend_DbTable kullanıyorum) çerçevesinde oluşturulan DESCRIBE sorguları mı? Hepsi gerekli mi? Ben onlar hakkında endişe olmalıdır ya da olası değil performansını etkilemeden edilecek?

3 Cevap

Bu sorgular tabloları şemasını tespit etmek Zend_Db_Table tarafından yürütülür. Siz aklınızda şemasını değiştirmek eğer sürekli aramaları önlemek için bir Zend_Cache kullanarak sonuçları önbelleğe Zend_Db_Table istiyoruz, ama çıplak olabilir.

Sen kullanarak yapabilirsiniz:

Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);

Zend_Db_Adapter_Abstract::describeTable() açıkça bir birincil anahtar belirtmeniz gerekmez zaman Zend_Db_Table Bu örnek için kullanılan kullanırken tabloları Metaveriyi almak için bu sorguları yapar. Sen MetaData önbelleğini etkinleştirmek veya sadece yerine Zend_Db_Table ve Zend_Db kullanabilirsiniz.

I think Bu çok olsa sorguları açıklamak zorunda olmamalıdır. Bir Zend_Db_Table örneği kurulduktan sonra, bu kalan istek için ilk sorgudan sonra meta verileri depolamak olacaktır. Bu neyin neden olduğunu bulmak için Zend_Debugger veya Xdebug kullanmaya çalışın.

Görmek

Benim baz model, sınıf statik bir dizi Zend_DbTable örneklerini saklamak için bir singleton deseni kullanılmıştır. Bu benim için yeterince iyi olduğunu ve ayrıca örneği gereken nesnelerin sayısını azaltır istek başına birine DB sorguları azaltır.

Örneğin:

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];
}