簡體   English   中英

學說分頁器Foreach非常慢

[英]Doctrine Paginator Foreach very slow

我在symfony2項目中使用了學說。

我有一張桌子活動和一張桌子照片。 一個事件可以有一張或多張照片,而一張照片與一個事件有關。

這是我的dql查詢之一:

    $dql = "
    SELECT e, (e.views * 0.1) + (e.likes * 0.9) as ratingEvent
    FROM WevseenMainBundle:Event e
    INNER JOIN e.photos p
    INNER JOIN e.firstPhoto fp
    WHERE fp.date BETWEEN :dateA AND :dateB
    AND p.lat BETWEEN :latA AND :latB
    AND ( p.lng > :lngA AND p.lng < :lngB )
    AND e.status = 'open'
    GROUP BY e
    HAVING COUNT(p.id) >= :minCountPhotos
    ORDER BY ratingEvent DESC
    ";

    $query = $em->createQuery($dql)
    ->setParameters($parameters)
    ->setFirstResult($firstEntry) // 0
    ->setMaxResults($numberOf); // 10

    $paginatorEvents = new Paginator($query, true);

對於類似11500個事件和16萬張照片的查詢,查詢速度非常慢(超過10秒),它來自

GROUP BY e
HAVING COUNT(p.id) >= :minCountPhotos

沒有這個,它很快。

我檢查了sf2分析器,它說:

SELECT count(DISTINCT e0_.id) AS sclr0 FROM Event e0_ INNER JOIN Photo p1_ ON e0_.id = p1_.event_id INNER JOIN Photo p2_ ON e0_.firstPhoto_id = p2_.id WHERE p2_.date BETWEEN ? AND ? AND p1_.lat BETWEEN ? AND ? AND (p1_.lng > ? AND p1_.lng < ?) AND e0_.status = 'open' GROUP BY e0_.id, e0_.name, e0_.description, e0_.nb_photos, e0_.views, e0_.viewsEventPhotos, e0_.votes, e0_.rating, e0_.likes, e0_.up, e0_.down, e0_.status, e0_.end, e0_.time, e0_.averageTimeEvent, e0_.averageTimePhotos, e0_.averageTimeEventAndPhotos, e0_.needInstagramUpdate, e0_.origin, e0_.featured, e0_.firstPhoto_id HAVING COUNT(p1_.id) >= ?
Parameters: [Object(DateTime), Object(DateTime), '-42.93442389074508', '73.48078267112892', '-180', '180', '2']

Time: 2029.33 ms

    SELECT DISTINCT e0_.id AS id0, e0_.views * 1 + e0_.likes * 0 AS sclr1 FROM Event e0_
INNER JOIN Photo p1_ ON e0_.id = p1_.event_id INNER JOIN Photo p2_ ON e0_.firstPhoto_id = p2_.id WHERE p2_.date BETWEEN ? AND ? AND p1_.lat BETWEEN ? AND ? AND (p1_.lng > ? AND p1_.lng < ?) AND e0_.status = 'open' GROUP BY e0_.id, e0_.name, e0_.description, e0_.nb_photos, e0_.views, e0_.viewsEventPhotos, e0_.votes, e0_.rating, e0_.likes, e0_.up, e0_.down, e0_.status, e0_.end, e0_.time, e0_.averageTimeEvent, e0_.averageTimePhotos, e0_.averageTimeEventAndPhotos, e0_.needInstagramUpdate, e0_.origin, e0_.featured, e0_.firstPhoto_id HAVING COUNT(p1_.id) >= ? ORDER BY sclr1 DESC LIMIT 10 OFFSET 0

Time: 6179.01 ms

這是兩個需要時間的查詢。 我該如何改善呢?

更新,解決方案:

GROUP BY e

GROUP BY e.id

僅當您在分頁程序上迭代時,才會執行您的請求。 您應該將翻譯后的SQL請求復制並配置到Doctrine之外,可能需要8秒鍾才能執行。 一旦將一些明智選擇的索引添加到表中,它的速度就會更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM