Doctrine 1.2 Nested Set 真的很慢。我该如何改进它。(NestedSet)

发布于 2024-10-11 02:57:50 字数 349 浏览 2 评论 0原文

我使用 Doctrine 1.2 执行一个简单的查询。

这是查询。

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

为什么这么慢?


任何人都有一个解决方案来获得更好的性能。
谢谢

I perform a simple query with Doctrine 1.2.

Here is the query.

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

Why this is so slow ?.

Anybody has a solution to get a better performance of it.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

离线来电— 2024-10-18 02:57:50

当我对我的应用程序进行基准测试时,我发现使用 Doctrine_Core::HYDRATE_ARRAY 会产生很大的差异。当仅在 View 中使用时,这通常是有意义的。

如果您需要更复杂的嵌套集,那么使用 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)

如果你使用 Ubuntu,Xdebug 分析会非常有帮助:

sudo apt-get install 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-data /tmp/xdebug

chmod 774 /tmp/xdebug

然后我使用 KCachegrind 查看输出,希望这有帮助

When I benchmarked my app I found that using the Doctrine_Core::HYDRATE_ARRAY made a big difference. When only using in View this often makes sense.

If you need more complex nested sets it may be a better option to just use the Doctrine_Query.

What you want is probably a query something like this:

$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 profiling can be very helpful, if your using Ubuntu:

sudo apt-get install php5-xdebug

Then:

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

In xdebug.ini I have:

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"

Remember to create the dir:

mkdir /tmp/xdebug

sudo chgrp www-data /tmp/xdebug

chmod 774 /tmp/xdebug

Then I use KCachegrind to look at the output, hope this helps

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文