0

間違った質問をしたので、もう一度やり直します(すみません)。クエリを詳細に読む必要はありませんが、アイデアを提供するだけです。

とにかく:問題のクエリは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と、6 ミリ秒で実行されます。これらすべての結合には余分な時間がかかると思いますが、心配する必要はありません。

最初は遅いと思い ORDER BYましたが、間違っていました。私は試した

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

(同じことですが、結合はありません) 2ms で実行されます。

部品の取り外しを提案するこの質問を含む他の質問も読みました。JOINDoctrine2でこれが可能だった場合、それはうまくいくかもしれません:

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

IDを取得した後、元のクエリのクローンでそれらを使用します。

ページネーションの問題を解決するにはどうすればよいですか?

ノート:

句を完全に削除してもWHERE、クエリには同じ1.2秒かかるため、問題はありません。

ありがとう。

4

1 に答える 1

0

type と 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 
于 2013-07-04T13:39:00.020 に答える