2010-02-09 5 views
14

Ich habe nur FirePHP in Zend eingerichtet und ich bemerke eine große Anzahl von DESCRIBE Abfragen. Einige Seiten haben mindestens 50 identische Abfragen in derselben Tabelle. z.B.Viele DESCRIBE Abfragen in Zend Framework

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

... und es geht weiter.

Sind all diese DESCRIBE-Abfragen vom Framework generiert (ich verwende Zend_DbTable)? Sind sie alle notwendig? Sollte ich mir Sorgen um sie machen, oder werden sie sich wahrscheinlich nicht auf die Leistung auswirken?

Antwort

13

Diese Abfragen werden durch Zend_Db_Table ausgeführt, um das Schema der Tabellen zu erkennen. Du kannst Zend_Db_Table bitten, die Ergebnisse mit einem Zend_Cache zwischenzuspeichern, um ständige Aufrufe zu verhindern, aber denke daran, wenn du das Schema änderst.

Sie können mit so tun:

Zend_Db_Table_Abstract::setDefaultMetadataCache($cache); 
+0

Ich bin daran interessiert. Kennen Sie eine gute eingehende Ressource zum Einrichten des $ -Cache-Teils? – Sonny

+0

Schauen Sie sich das Zend Framework Handbuch an: http://framework.zend.com/manual/en/zend.db.table.html#zend.db.table.metadata.caching – Johnco

+0

Ich habe das gelesen. Ich suche nach etwas mit Vorschlägen zu den Vor-und Nachteile der verschiedenen Einstellungen, wie der Cache-Typ zu verwenden, welches Verzeichnis zu verwenden, wenn Sie den Typ "Datei", etc. – Sonny

3

Zend_Db_Adapter_Abstract::describeTable() verarbeitet diese Abfragen, um die Metadaten Ihrer Tabellen zu ermitteln, wenn Zend_Db_Table verwendet wird. Dies wird beispielsweise verwendet, wenn Sie keinen Primärschlüssel explizit angeben. Sie können den MetaData-Cache aktivieren oder einfach Zend_Db anstelle von Zend_Db_Table verwenden.

Ich denke, Sie sollten nicht so viele beschreiben Abfragen obwohl. Sobald eine Zend_Db_Table Instanz eingerichtet ist, werden die Metadaten nach der ersten Abfrage für die verbleibende Anforderung gespeichert. Versuche mit Zend_Debugger oder Xdebug herauszufinden, was das verursacht.

Siehe

+0

dies jedes Mal neue Instanz von Zend_Db_Table erfolgt erstellt wird. Deshalb ist es so oft passiert. –

+0

@tomas ja, und deshalb rätselt es mich, weil es keinen Grund geben sollte, die Instanz mehrmals in einer Anfrage zu erstellen. – Gordon

+0

Ich habe eine DBTable für jede Instanz des Modells instanziiert. Ich habe es gelöst, indem ich die dbTable-Instanz als statische Eigenschaft im Modell zwischengespeichert habe. – Tamlyn

3

verwendete ich ein Singletonmuster auf meinem Basismodell Klasse die Zend_DbTable Instanzen in einem statischen Array zu speichern. Dies reduziert die DB-Abfragen auf eins pro Anfrage, was für mich gut genug ist und auch die Anzahl der Objekte reduziert, die instanziiert werden müssen.

Zum Beispiel:

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

Ich mache etwas ähnliches, indem ich Zend_Registry benutze. – Sonny

+1

Registrierung ist besser (kürzerer Code), denke ich ... :) –

+0

Warum haben Sie mehrere Instanzen überhaupt? Ich meine, für mehrere Tabellen ja, aber Sie brauchen nicht mehrere Instanzen der gleichen Tabelle, oder? – Gordon