我试图优化我的查询。
它需要非常慢,需要超过50次才能获得结果: - (
我有超过120 000个数据。
这是我的查询
$q = $this->_em->createQuery("SELECT c FROM AppBundle:Cabinne c JOIN AppBundle:Rdv r WITH c.id NOT
IN (SELECT us.id FROM AppBundle:Rdv rv JOIN rv.cabinne_id us JOIN us.centre cee
WHERE (rv.dateRdv >= :start AND rv.dateRdv < :enddate AND rv.etat = :etat )
OR (rv.dateRdv <= :start AND rv.DateFin > :start AND rv.etat = :etat )
OR (rv.dateRdv < :start AND rv.DateFin > :enddate AND rv.etat = :etat ) AND cee.id = :id ) JOIN c.centre ceee WHERE ceee.id = :id ");
$q->setParameter('start', $start);
$q->setParameter('enddate', $end);
$q->setParameter('etat', 1);
$q->setParameter('id', $id);
有人可以帮忙吗 谢谢
答案 0 :(得分:0)
简单回答:Paginate并且只获得前10个结果。
否则我希望您尝试在后台处理上执行此操作。如果没有,您还需要优化其他内容而不是查询。
1)我确信这段代码执行速度非常快〜2ms,因为你没有执行查询。请添加完整的代码。
2)您是否使用symfony profiler或mysql log slow查询并检查生成的查询?没有学说运行该查询需要多长时间?哪个是RDMS执行计划在SQL(不是DQL)前面添加描述?
3)可能你最大的问题是你如何处理学说水合物的数据。尝试通过xdebug分析看看在水化器中花费了多少时间。水化器会降低你的查询速度吗?
如果问题是查询时间。您可能需要创建数据库视图和一些索引。 RDMS执行计划将向您显示问题所在。
如果您的问题出现在保湿器上,您可以尝试返回迭代器并使用按需保温器迭代结果。