Zend_Db Performance

Zend_Db ist ein Datenbank Abstraktion Layer und ist dazu gedacht eine gemeinsame API für SQL Operationen zu bieten. Zend_Db_Table ist ein Table Data Bateway, dazu gedacht übliche Tabellen-artige Datenbank Operationen zu abstrahieren. Wegen Ihrer abstrakten Natur und der "Magie" die Sie versteckt haben um Ihre Operationen durchführen zu können, können Sie manchmal auch zu Geschwindigkeitsnachteilen führen.

Wie kann ich den Overhead reduzieren der von Zend_Db_Table eingeführt wird um die Metadaten der Tabelle zu erhalten?

Um die Verwendung so einfach wie möglich zu halten, und auch sich konstant ändernde Schemata wärend der Entwicklung zu unterstützen, macht Zend_Db_Table einiges an Magie unter seinem Hut: bei der ersten Verwendung, holt es das Tabellenschema und speichert es im Objekt. Diese Operation ist normalerweise sehr teuer, unabhängig von der Datenbank -- das zu einer Schwachstelle in der Produktion führen kann.

Glücklicherweise gibt es Techniken um die Situation zu verbessern.

Den Metadaten Cache verwenden

Zend_Db_Table kann optional Zend_Cache verwenden um die Metadaten der Tabelle zu cachen. Dieser ist typischerweise schneller im Zugriff und nicht so teuer wie das holen der Metadaten von der Tabelle selbst.

Die Dokumentation von Zend_Db_Table enthält Informationen über das Cachen der Metadaten.

Die Metadaten in der Tabellendefinition fix codieren

Mit 1.7.0, bietet Zend_Db_Table auch Unterstützung für fix kodierte Metadaten in der Tabellen Definition. Das ist ein schwierigerer Verwendungsfall, und sollte nur dann verwendet werden wenn man weiß das sich das Tabellenschema nicht ändern wird, oder das man fähig ist die Definition immer up-to-date zu halten.

SQL die mit Zend_Db_Select erzeugt wurde greift nicht auf die Indezes zu; wie kann man das besser machen?

Zend_Db_Select ist relativ gut in seinem Job. Trotzdem kann es, wenn man komplexe Abfragen benötigt die Joins oder Unterabfragen enthalten, sehr naiv sein.

Selbst getuntes SQL schreiben

Die einzige echte Antwort ist es eigenes SQL zu schreiben; Zend_Db erfordert nicht die Verwendung von Zend_Db_Select, als ist die Verwendung von eigenen, getunten SQL Select Statements, eine perfekte und legitime Anwendung.

Lasse EXPLAIN auf den Abfragen laufen, und teste eine Vielzahl von Möglichkeiten bis man die eigenen Indezes auf dem besten und performantesten Weg trifft -- und dann sollte dieses SQL als Klasseneigenschaft oder Konstante fix kodiert werden.

Wenn das SQL variable Argumente benötigt, können Platzhalter im SQL verwendet werden und in einer Kombination von vsprintf() und array_walk() verwendet werden um Werte in das SQL zu injizieren:

// $adapter ist der DB Adapter. In Zend_Db_Table ist es durch
// Verwendung von $this->getAdapter() zu empfangen.
$sql = vsprintf(
    self::SELECT_FOO,
    array_walk($values, array($adapter, 'quoteInto'))
);