Doctrine 1.2 Nested Set работает очень медленно. Как я могу его улучшить. (NestedSet)

Я выполняю простой запрос с помощью Doctrine 1.2.

Вот запрос.

$cat = Doctrine_Core::getTable('Model_Category')->find($CatID);
if( isset($cat) && $cat->getNode()->hasChildren())
            $this->view->CategoryTree = $cat->getNode()->getChildren();

Почему это так медленно?.


У кого-нибудь есть решение для повышения производительности.
Спасибо


person Jean-Francois    schedule 07.01.2011    source источник


Ответы (1)


Когда я тестировал свое приложение, я обнаружил, что использование Doctrine_Core::HYDRATE_ARRAY имеет большое значение. При использовании только в представлении это часто имеет смысл.

Если вам нужны более сложные вложенные наборы, может быть лучшим вариантом просто использовать Doctrine_Query.

То, что вы хотите, это, вероятно, запрос примерно так:

$query = Doctrine_Query::create();
$query->from('Model_Category cat')
    ->leftJoin('cat.Node n')
    ->leftJoin('n.Childre c')
    ->where('count(c.id) > 0')
    ->andWhere('cat.id = ?', $id);
$query->execute(array(1), Doctrine_Core::HYDRATE_ARRAY)

Профилирование Xdebug может быть очень полезным, если вы используете Ubuntu:

sudo apt-get установить php5-xdebug

Потом:

sudo gedit /etc/php5/apache2/conf.d/xdebug.ini

В xdebug.ini у меня есть:

zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so
xdebug.profiler_enable=on
xdebug.profiler_output_dir="/tmp/xdebug"
xdebug.profiler_output_name = "cachegrind.out.%H.%R.%t"

Не забудьте создать каталог:

mkdir/tmp/xdebug

sudo chgrp www-данные /tmp/xdebug

chmod 774 /tmp/xdebug

Затем я использую KCachegrind, чтобы посмотреть результат, надеюсь, это поможет.

person Max Gordon    schedule 07.01.2011
comment
Спасибо, Макс, ты сэкономил мне много времени. - person Jean-Francois; 08.01.2011