私は symfony2 プロジェクトでドクトリンを使用しています。
テーブルイベントとテーブル写真があります。1 つのイベントには 1 枚以上の写真を含めることができ、写真は 1 つのイベントに関連しています。
これが私のdqlクエリの1つです:
$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 件のイベントと 160,000 枚の写真の場合、クエリは非常に遅く (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
時間のかかる 2 つのクエリです。どうすればこれを改善できますか?
更新、解決策:
かわった
GROUP BY e
と
GROUP BY e.id