2013-07-04 5 views
0

내가 그래서 다시 (죄송합니다) 시도 할 wrong question 물었다 결합한다. 세부 사항에서 쿼리를 읽을 필요는 없지만 아이디어를 제공하기 만하면됩니다.느린 실행 순서는

어쨌든 : 문제의 쿼리는 Doctrine2에 의해 생성 된이있다 (나는 SELECT 부분을 잘라)

FROM 
    tbl_story t0_ 
     LEFT JOIN tbl_user t1_ ON t0_.creator_id = t1_.id 
     LEFT JOIN tbl_image t2_ ON t1_.avatar_id = t2_.id 
     LEFT JOIN tbl_image t3_ ON t0_.id = t3_.story_id 
     LEFT JOIN tbl_like t4_ ON t0_.id = t4_.story_id AND (t4_.creator_id = 3) 
     LEFT JOIN tbl_comment t5_ ON t0_.id = t5_.story_id 
     LEFT JOIN tbl_like t6_ ON t5_.id = t6_.comment_id AND (t6_.creator_id = 3) 
     LEFT JOIN tbl_user t7_ ON t5_.creator_id = t7_.id 
     LEFT JOIN tbl_image t8_ ON t7_.avatar_id = t8_.id 
     LEFT JOIN tbl_location_city t9_ ON t0_.city_id = t9_.id 
     LEFT JOIN tbl_location_state t10_ ON t9_.state_id = t10_.id 
     LEFT JOIN tbl_location_country t11_ ON t10_.country_id = t11_.id 
     LEFT JOIN tbl_story t12_ ON t0_.parent_id = t12_.id 
     LEFT JOIN tbl_page t13_ ON t0_.page_id = t13_.id 
     LEFT JOIN tbl_page_type t14_ ON t13_.page_type_id = t14_.id 
     LEFT JOIN tbl_story_tag t25_ ON t0_.id = t25_.story_id 
     LEFT JOIN tbl_tag t15_ ON t15_.id = t25_.tag_id 
     LEFT JOIN tbl_story_linked_user_reference t16_ ON t0_.id = t16_.story_id 
     LEFT JOIN tbl_user t17_ ON t16_.user_id = t17_.id 
     LEFT JOIN tbl_image t18_ ON t17_.avatar_id = t18_.id 
     LEFT JOIN tbl_story t19_ ON t0_.id = t19_.parent_id 
     LEFT JOIN tbl_album t20_ ON t0_.parent_album_id = t20_.id 
     LEFT JOIN tbl_image t21_ ON t20_.id = t21_.album_id 
     LEFT JOIN tbl_image_linked_user t22_ ON t21_.id = t22_.image_id 
     LEFT JOIN tbl_user t23_ ON t22_.user_id = t23_.id 
     LEFT JOIN tbl_image t24_ ON t23_.avatar_id = t24_.id 
WHERE (
    t0_.creator_id = 3 
    OR t0_.id IN 
     (SELECT 
      t26_.id 
     FROM tbl_story t26_ 
      INNER JOIN tbl_story_circle_visibility t28_ ON t26_.id = t28_.story_id 
      INNER JOIN tbl_circle t27_ ON t27_.id = t28_.circle_id 
      INNER JOIN tbl_user_circle_reference t29_ ON t27_.id = t29_.circle_id 
      AND (t29_.user_id = 3)) 
    OR t0_.is_public = 1 
) 
    AND t0_.is_draft = 0 
    AND t0_.type IN (0, 3, 2, 21) 
ORDER BY t0_.created_at DESC 
LIMIT 7 

문제 : ORDER BY와 는 쿼리 tbl_story 만 31.000 행이 때 실행하는 데 1.2 초가 걸린다 (메인 쿼리). ORDER BY을 제거하면 6ms 후에 실행됩니다. 이러한 모든 조인은 추가 시간이 필요하지만 걱정할 필요는 없습니다.

내가 처음 thoughtORDER BY 속도가 느립니다하지만 내가 잘못했다. 시도했는데

SELECT * FROM `tbl_story` ORDER BY created_at DESC LIMIT 7 

(같은 것이지만 조인이없는) 2ms에서 실행됩니다.

내가 너무 JOIN 부분을 제거하는 제안 this one을 포함한 다른 질문을 참조하십시오. 내가 ID의의를 가져 원래 쿼리의 복제에서 사용 후

$queryBuilder->select("o.id")->removeLeftJoins() 

과 : 그건 내가이 Doctrine2에 가능했던 경우 일 수 있습니다.

어떻게 매김의 문제를 해석 할 수 있습니까?

참고 : 나는 completelly WHERE 절을 제거 할 경우에도이 문제를주는 일이되지 않도록

, 쿼리가 같은 1.2 초 걸립니다.

감사합니다.

+0

나는 아침부터 슬픈했지만 당신은 내 일 ROFL했다 : 당신이 게시하고 쿼리에 대해 설명 할 수 D –

+0

? 나는 당신이 결합 된 테이블의 일부가 아니라 인덱싱 된 열을 사용하는 것으로 의심되는 – Kickstart

+0

http://pastebin.com/6evBkJF3 30 개 행이 있기 때문에 읽기가 좀 어렵습니다. Doctrine2는 어떤 유형의 관계를 찾으면 인덱스를 자동으로 생성합니다. – Zeljko

답변

0

나는 유형에 대한 인덱싱을 의심 것이며 is_draft은 MySQL이 그 인덱스의 통지를 적용하려면 좁은 것을 아래로는 충분하지 않을 수 있습니다.

creator_id에 색인이 있고 is_public에 다른 색인이 있고 다른 ID에 다른 색인이있는 경우 (아마도 기본 ID이므로 사용자가 가정 한 것처럼) 3 개의 통합 된 검색어를 사용하면 도움이 될 수 있습니다.

SELECT * 
FROM 
    tbl_story t0_ 
     LEFT JOIN tbl_user t1_ ON t0_.creator_id = t1_.id 
     LEFT JOIN tbl_image t2_ ON t1_.avatar_id = t2_.id 
     LEFT JOIN tbl_image t3_ ON t0_.id = t3_.story_id 
     LEFT JOIN tbl_like t4_ ON t0_.id = t4_.story_id AND (t4_.creator_id = 3) 
     LEFT JOIN tbl_comment t5_ ON t0_.id = t5_.story_id 
     LEFT JOIN tbl_like t6_ ON t5_.id = t6_.comment_id AND (t6_.creator_id = 3) 
     LEFT JOIN tbl_user t7_ ON t5_.creator_id = t7_.id 
     LEFT JOIN tbl_image t8_ ON t7_.avatar_id = t8_.id 
     LEFT JOIN tbl_location_city t9_ ON t0_.city_id = t9_.id 
     LEFT JOIN tbl_location_state t10_ ON t9_.state_id = t10_.id 
     LEFT JOIN tbl_location_country t11_ ON t10_.country_id = t11_.id 
     LEFT JOIN tbl_story t12_ ON t0_.parent_id = t12_.id 
     LEFT JOIN tbl_page t13_ ON t0_.page_id = t13_.id 
     LEFT JOIN tbl_page_type t14_ ON t13_.page_type_id = t14_.id 
     LEFT JOIN tbl_story_tag t25_ ON t0_.id = t25_.story_id 
     LEFT JOIN tbl_tag t15_ ON t15_.id = t25_.tag_id 
     LEFT JOIN tbl_story_linked_user_reference t16_ ON t0_.id = t16_.story_id 
     LEFT JOIN tbl_user t17_ ON t16_.user_id = t17_.id 
     LEFT JOIN tbl_image t18_ ON t17_.avatar_id = t18_.id 
     LEFT JOIN tbl_story t19_ ON t0_.id = t19_.parent_id 
     LEFT JOIN tbl_album t20_ ON t0_.parent_album_id = t20_.id 
     LEFT JOIN tbl_image t21_ ON t20_.id = t21_.album_id 
     LEFT JOIN tbl_image_linked_user t22_ ON t21_.id = t22_.image_id 
     LEFT JOIN tbl_user t23_ ON t22_.user_id = t23_.id 
     LEFT JOIN tbl_image t24_ ON t23_.avatar_id = t24_.id 
WHERE t0_.creator_id = 3 
    AND t0_.is_draft = 0 
    AND t0_.type IN (0, 3, 2, 21) 
UNION 
SELECT * 
FROM 
    tbl_story t0_ 
     LEFT JOIN tbl_user t1_ ON t0_.creator_id = t1_.id 
     LEFT JOIN tbl_image t2_ ON t1_.avatar_id = t2_.id 
     LEFT JOIN tbl_image t3_ ON t0_.id = t3_.story_id 
     LEFT JOIN tbl_like t4_ ON t0_.id = t4_.story_id AND (t4_.creator_id = 3) 
     LEFT JOIN tbl_comment t5_ ON t0_.id = t5_.story_id 
     LEFT JOIN tbl_like t6_ ON t5_.id = t6_.comment_id AND (t6_.creator_id = 3) 
     LEFT JOIN tbl_user t7_ ON t5_.creator_id = t7_.id 
     LEFT JOIN tbl_image t8_ ON t7_.avatar_id = t8_.id 
     LEFT JOIN tbl_location_city t9_ ON t0_.city_id = t9_.id 
     LEFT JOIN tbl_location_state t10_ ON t9_.state_id = t10_.id 
     LEFT JOIN tbl_location_country t11_ ON t10_.country_id = t11_.id 
     LEFT JOIN tbl_story t12_ ON t0_.parent_id = t12_.id 
     LEFT JOIN tbl_page t13_ ON t0_.page_id = t13_.id 
     LEFT JOIN tbl_page_type t14_ ON t13_.page_type_id = t14_.id 
     LEFT JOIN tbl_story_tag t25_ ON t0_.id = t25_.story_id 
     LEFT JOIN tbl_tag t15_ ON t15_.id = t25_.tag_id 
     LEFT JOIN tbl_story_linked_user_reference t16_ ON t0_.id = t16_.story_id 
     LEFT JOIN tbl_user t17_ ON t16_.user_id = t17_.id 
     LEFT JOIN tbl_image t18_ ON t17_.avatar_id = t18_.id 
     LEFT JOIN tbl_story t19_ ON t0_.id = t19_.parent_id 
     LEFT JOIN tbl_album t20_ ON t0_.parent_album_id = t20_.id 
     LEFT JOIN tbl_image t21_ ON t20_.id = t21_.album_id 
     LEFT JOIN tbl_image_linked_user t22_ ON t21_.id = t22_.image_id 
     LEFT JOIN tbl_user t23_ ON t22_.user_id = t23_.id 
     LEFT JOIN tbl_image t24_ ON t23_.avatar_id = t24_.id 
WHERE t0_.id IN 
     (SELECT 
      t26_.id 
     FROM tbl_story t26_ 
      INNER JOIN tbl_story_circle_visibility t28_ ON t26_.id = t28_.story_id 
      INNER JOIN tbl_circle t27_ ON t27_.id = t28_.circle_id 
      INNER JOIN tbl_user_circle_reference t29_ ON t27_.id = t29_.circle_id 
      AND (t29_.user_id = 3)) 
    AND t0_.is_draft = 0 
    AND t0_.type IN (0, 3, 2, 21) 
UNION 
SELECT * 
FROM 
    tbl_story t0_ 
     LEFT JOIN tbl_user t1_ ON t0_.creator_id = t1_.id 
     LEFT JOIN tbl_image t2_ ON t1_.avatar_id = t2_.id 
     LEFT JOIN tbl_image t3_ ON t0_.id = t3_.story_id 
     LEFT JOIN tbl_like t4_ ON t0_.id = t4_.story_id AND (t4_.creator_id = 3) 
     LEFT JOIN tbl_comment t5_ ON t0_.id = t5_.story_id 
     LEFT JOIN tbl_like t6_ ON t5_.id = t6_.comment_id AND (t6_.creator_id = 3) 
     LEFT JOIN tbl_user t7_ ON t5_.creator_id = t7_.id 
     LEFT JOIN tbl_image t8_ ON t7_.avatar_id = t8_.id 
     LEFT JOIN tbl_location_city t9_ ON t0_.city_id = t9_.id 
     LEFT JOIN tbl_location_state t10_ ON t9_.state_id = t10_.id 
     LEFT JOIN tbl_location_country t11_ ON t10_.country_id = t11_.id 
     LEFT JOIN tbl_story t12_ ON t0_.parent_id = t12_.id 
     LEFT JOIN tbl_page t13_ ON t0_.page_id = t13_.id 
     LEFT JOIN tbl_page_type t14_ ON t13_.page_type_id = t14_.id 
     LEFT JOIN tbl_story_tag t25_ ON t0_.id = t25_.story_id 
     LEFT JOIN tbl_tag t15_ ON t15_.id = t25_.tag_id 
     LEFT JOIN tbl_story_linked_user_reference t16_ ON t0_.id = t16_.story_id 
     LEFT JOIN tbl_user t17_ ON t16_.user_id = t17_.id 
     LEFT JOIN tbl_image t18_ ON t17_.avatar_id = t18_.id 
     LEFT JOIN tbl_story t19_ ON t0_.id = t19_.parent_id 
     LEFT JOIN tbl_album t20_ ON t0_.parent_album_id = t20_.id 
     LEFT JOIN tbl_image t21_ ON t20_.id = t21_.album_id 
     LEFT JOIN tbl_image_linked_user t22_ ON t21_.id = t22_.image_id 
     LEFT JOIN tbl_user t23_ ON t22_.user_id = t23_.id 
     LEFT JOIN tbl_image t24_ ON t23_.avatar_id = t24_.id 
WHERE t0_.is_public = 1 
    AND t0_.is_draft = 0 
    AND t0_.type IN (0, 3, 2, 21) 
ORDER BY t0_.created_at DESC 
LIMIT 7 
+0

Unfortunatelly, Doctrine2에서는 지원되지 않으므로'UNION '을 사용할 수 없습니다. – Zeljko

+0

아야. 두 번째 프레임 워크를 제어하는 ​​것 이상으로 갈 것입니다! – Kickstart