Множество запросов DESCRIBE в Zend Framework

Я только что установил FirePHP в Zend, и я замечаю огромное количество запросов DESCRIBE. На некоторых страницах есть 50 или более одинаковых запросов в одной таблице. например.

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)? Все ли они необходимы? Должен ли я беспокоиться о них или они вряд ли будут влиять на производительность?

Ответ 1

Эти запросы выполняются Zend_Db_Table для обнаружения схемы таблиц. Вы можете попросить Zend_Db_Table кэшировать результаты с помощью Zend_Cache для предотвращения постоянных вызовов, но не забывайте об этом, если вы измените схему.

Вы можете сделать это, используя:

Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);

Ответ 2

Zend_Db_Adapter_Abstract::describeTable() запрашивают ли эти запросы метаданные ваших таблиц при использовании Zend_Db_Table Это используется, например, если вы явно не указали первичный ключ. Вы можете включить кеш MetaData или просто использовать Zend_Db вместо Zend_Db_Table.

Я думаю, что вам не нужно много описывать запросы. После того как экземпляр Zend_Db_Table настроен, он сохранит метаданные после первого запроса для оставшегося запроса. Попробуйте использовать Zend_Debugger или Xdebug, чтобы узнать, что вызывает это.

См.

Ответ 3

Я использовал шаблон singleton для хранения экземпляров 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];
}