【问题标题】:Optimizing SQL query generated with Extbase优化使用 Extbase 生成的 SQL 查询
【发布时间】:2014-11-25 14:17:53
【问题描述】:

我正在对包含大量记录的几个表进行查询。在一个特定的关系中,关系是 m:n,并且生成的查询加入了适当的表。问题是生成的查询非常慢。我可以通过取出 JOIN 并将其放入一个子查询中来重写它,这可以解决问题,但我不确定如何将它添加到我创建查询的存储库中。基本上我想要的是仍然使用 createQuery() 因为它做了很多检查但只优化了它的一小部分。

当前的实现是否有可能,还是我唯一的选择是从头开始编写整个查询?

【问题讨论】:

  • 也许您可以通过向表中添加一些键来加速连接查询?尝试为查询连接的列添加键。
  • 我已经添加了所有需要的键。问题是如何生成查询。我已经设法用 contains() 而不是 equals() 对其进行了更改,但是当我还添加排序列时,它又回到了同样的慢速。
  • 您是否尝试为排序列添加键?如果这没有帮助,我没有更多的想法,但也许其他人有。
  • 是的,问题不在于索引,而在于查询在不同表中搜索数据的方式。如果我可以在约束中添加一个简单的自定义语句,它将起作用,但到目前为止我找不到如何做到这一点。

标签: typo3 extbase typo3-6.2.x


【解决方案1】:

只需编写一个优化的手动查询:

$query = $this->createquery();
$query->getQuerySettings()->setRespectStoragePage(FALSE);
$query->statement('your query'); 
return $query->execute(TRUE);

只要查询仍然从属于存储库(和模型的子项)的表中返回记录,Extbase 仍然会执行您需要的映射,以便对对象、其子项及其属性具有 Fluid 访问权限。

【讨论】:

  • setReturnRawQueryResult(TRUE) 在 TYPO3 6.2 中已弃用 - 要获得相同的功能,请使用 query->execute(TRUE);并删除 setReturnRawQueryResult。
  • 谢谢,我在描述中修正了。
猜你喜欢
  • 2015-11-08
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
相关资源
最近更新 更多