2012-07-16 15 views
8

मेरे पास SQLAlchemy ORM द्वारा उत्पन्न एक क्वेरी है। यह एक विशिष्ट पाठ्यक्रम के लिए stream_items को अपने सभी हिस्सों के साथ-साथ संसाधनों, सामग्री टेक्स्ट ब्लॉक इत्यादि, और उन उपयोगकर्ताओं को पोस्ट करने के लिए पुनर्प्राप्त करना है। हालांकि, यह क्वेरी बेहद धीमी प्रतीत होती है, हमारे उत्पादन डेटाबेस पर 20,000 या तो डेटाबेस में उपयोगकर्ताओं के साथ मिनट, या पाठ्यक्रम के लिए stream_items, और प्रति स्ट्रीम_इटम के दो सामग्री टेक्स्ट ब्लॉक। ध्यान दें कि डेटाबेस में उपयोगकर्ताओं के अलावा किसी अन्य रिकॉर्ड के बहुत कम हैं क्योंकि हमने उपयोगकर्ताओं का एक समूह आयात किया लेकिन बहुत कम सामग्री।मैं एसक्यूएलकेमी द्वारा उत्पादित इस क्वेरी को कैसे अनुकूलित कर सकता हूं?

संपादित करें: ध्यान दें कि प्रत्येक ऑब्जेक्ट आईडी franklin_object तालिका में एक विदेशी कुंजी है।

मैं क्वेरी को देख कोशिश की है, और कई परेशान बिट्स की पहचान की है

  1. लुकअप में से एक अस्थायी का उपयोग करते हुए 'है (व्याख्या उत्पादन को देख); फाइलों का उपयोग करना '।
  2. उपयोगकर्ता तालिका कोई सूचकांक
  3. सामग्री पाठ खंड तालिका कोई सूचकांक के साथ दो बार मारा जाता है

हालांकि साथ दो बार मारा जाता है, मैं वास्तव में इन के बारे में क्या करना है, विशेष रूप से बाद के दो पता नहीं है मुद्दे।

SELECT stream_item.id        AS stream_item_id, 
     franklin_object.id       AS franklin_object_id, 
     franklin_object.type       AS franklin_object_type, 
     franklin_object.uuid       AS franklin_object_uuid, 
     stream_item.parent_id      AS stream_item_parent_id, 
     stream_item.shown_at       AS stream_item_shown_at, 
     stream_item.author_id      AS stream_item_author_id, 
     stream_item.stream_sort_at     AS stream_item_stream_sort_at, 
     stream_item.PUBLIC       AS stream_item_public, 
     stream_item.created_at      AS stream_item_created_at, 
     stream_item.updated_at      AS stream_item_updated_at, 
     anon_1.content_text_block_text    AS anon_1_content_text_block_text, 
     anon_2.resource_id       AS anon_2_resource_id, 
     anon_2.franklin_object_id     AS anon_2_franklin_object_id, 
     anon_2.franklin_object_type     AS anon_2_franklin_object_type, 
     anon_2.franklin_object_uuid     AS anon_2_franklin_object_uuid, 
     anon_2.resource_top_parent_resource   AS anon_2_resource_top_parent_resource, 
     anon_2.resource_top_parent_id    AS anon_2_resource_top_parent_id, 
     anon_2.resource_title      AS anon_2_resource_title, 
     anon_2.resource_url       AS anon_2_resource_url, 
     anon_2.resource_image      AS anon_2_resource_image, 
     anon_2.resource_created_at     AS anon_2_resource_created_at, 
     anon_2.resource_updated_at     AS anon_2_resource_updated_at, 
     franklin_object_1.id       AS franklin_object_1_id, 
     franklin_object_1.type      AS franklin_object_1_type, 
     franklin_object_1.uuid      AS franklin_object_1_uuid, 
     anon_1.content_text_block_id     AS anon_1_content_text_block_id, 
     anon_1.franklin_object_id     AS anon_1_franklin_object_id, 
     anon_1.franklin_object_type     AS anon_1_franklin_object_type, 
     anon_1.franklin_object_uuid     AS anon_1_franklin_object_uuid, 
     anon_1.content_text_block_position   AS anon_1_content_text_block_position, 
     anon_1.content_text_block_franklin_object_id AS anon_1_content_text_block_franklin_object_id, 
     anon_1.content_text_block_created_at   AS anon_1_content_text_block_created_at, 
     anon_1.content_text_block_updated_at   AS anon_1_content_text_block_updated_at, 
     anon_3.user_password       AS anon_3_user_password, 
     anon_3.user_auth_token      AS anon_3_user_auth_token, 
     anon_3.user_id        AS anon_3_user_id, 
     anon_3.franklin_object_id     AS anon_3_franklin_object_id, 
     anon_3.franklin_object_type     AS anon_3_franklin_object_type, 
     anon_3.franklin_object_uuid     AS anon_3_franklin_object_uuid, 
     anon_3.user_email       AS anon_3_user_email, 
     anon_3.user_auth_token_expiration   AS anon_3_user_auth_token_expiration, 
     anon_3.user_active       AS anon_3_user_active, 
     anon_3.user_activation_token     AS anon_3_user_activation_token, 
     anon_3.user_first_name      AS anon_3_user_first_name, 
     anon_3.user_last_name      AS anon_3_user_last_name, 
     anon_3.user_image       AS anon_3_user_image, 
     anon_3.user_bio        AS anon_3_user_bio, 
     anon_3.user_aspirations      AS anon_3_user_aspirations, 
     anon_3.user_website       AS anon_3_user_website, 
     anon_3.user_resume       AS anon_3_user_resume, 
     anon_3.user_resume_name      AS anon_3_user_resume_name, 
     anon_3.user_primary_role      AS anon_3_user_primary_role, 
     anon_3.user_institution_id     AS anon_3_user_institution_id, 
     anon_3.user_birth_date      AS anon_3_user_birth_date, 
     anon_3.user_gender       AS anon_3_user_gender, 
     anon_3.user_graduation_year     AS anon_3_user_graduation_year, 
     anon_3.user_complete       AS anon_3_user_complete, 
     anon_3.user_masthead_y_position    AS anon_3_user_masthead_y_position, 
     anon_3.user_masthead       AS anon_3_user_masthead, 
     anon_3.user_fb_access_token     AS anon_3_user_fb_access_token, 
     anon_3.user_fb_user_id      AS anon_3_user_fb_user_id, 
     anon_3.user_location       AS anon_3_user_location, 
     anon_3.user_created_at      AS anon_3_user_created_at, 
     anon_3.user_updated_at      AS anon_3_user_updated_at, 
     anon_4.content_text_block_text    AS anon_4_content_text_block_text, 
     anon_4.content_text_block_id     AS anon_4_content_text_block_id, 
     anon_4.franklin_object_id     AS anon_4_franklin_object_id, 
     anon_4.franklin_object_type     AS anon_4_franklin_object_type, 
     anon_4.franklin_object_uuid     AS anon_4_franklin_object_uuid, 
     anon_4.content_text_block_position   AS anon_4_content_text_block_position, 
     anon_4.content_text_block_franklin_object_id AS anon_4_content_text_block_franklin_object_id, 
     anon_4.content_text_block_created_at   AS anon_4_content_text_block_created_at, 
     anon_4.content_text_block_updated_at   AS anon_4_content_text_block_updated_at, 
     anon_5.user_password       AS anon_5_user_password, 
     anon_5.user_auth_token      AS anon_5_user_auth_token, 
     anon_5.user_id        AS anon_5_user_id, 
     anon_5.franklin_object_id     AS anon_5_franklin_object_id, 
     anon_5.franklin_object_type     AS anon_5_franklin_object_type, 
     anon_5.franklin_object_uuid     AS anon_5_franklin_object_uuid, 
     anon_5.user_email       AS anon_5_user_email, 
     anon_5.user_auth_token_expiration   AS anon_5_user_auth_token_expiration, 
     anon_5.user_active       AS anon_5_user_active, 
     anon_5.user_activation_token     AS anon_5_user_activation_token, 
     anon_5.user_first_name      AS anon_5_user_first_name, 
     anon_5.user_last_name      AS anon_5_user_last_name, 
     anon_5.user_image       AS anon_5_user_image, 
     anon_5.user_bio        AS anon_5_user_bio, 
     anon_5.user_aspirations      AS anon_5_user_aspirations, 
     anon_5.user_website       AS anon_5_user_website, 
     anon_5.user_resume       AS anon_5_user_resume, 
     anon_5.user_resume_name      AS anon_5_user_resume_name, 
     anon_5.user_primary_role      AS anon_5_user_primary_role, 
     anon_5.user_institution_id     AS anon_5_user_institution_id, 
     anon_5.user_birth_date      AS anon_5_user_birth_date, 
     anon_5.user_gender       AS anon_5_user_gender, 
     anon_5.user_graduation_year     AS anon_5_user_graduation_year, 
     anon_5.user_complete       AS anon_5_user_complete, 
     anon_5.user_masthead_y_position    AS anon_5_user_masthead_y_position, 
     anon_5.user_masthead       AS anon_5_user_masthead, 
     anon_5.user_fb_access_token     AS anon_5_user_fb_access_token, 
     anon_5.user_fb_user_id      AS anon_5_user_fb_user_id, 
     anon_5.user_location       AS anon_5_user_location, 
     anon_5.user_created_at      AS anon_5_user_created_at, 
     anon_5.user_updated_at      AS anon_5_user_updated_at, 
     anon_6.stream_item_id      AS anon_6_stream_item_id, 
     anon_6.franklin_object_id     AS anon_6_franklin_object_id, 
     anon_6.franklin_object_type     AS anon_6_franklin_object_type, 
     anon_6.franklin_object_uuid     AS anon_6_franklin_object_uuid, 
     anon_6.stream_item_parent_id     AS anon_6_stream_item_parent_id, 
     anon_6.stream_item_shown_at     AS anon_6_stream_item_shown_at, 
     anon_6.stream_item_author_id     AS anon_6_stream_item_author_id, 
     anon_6.stream_item_stream_sort_at   AS anon_6_stream_item_stream_sort_at, 
     anon_6.stream_item_public     AS anon_6_stream_item_public, 
     anon_6.stream_item_created_at    AS anon_6_stream_item_created_at, 
     anon_6.stream_item_updated_at    AS anon_6_stream_item_updated_at 
FROM franklin_object 
     INNER JOIN stream_item 
       ON franklin_object.id = stream_item.id 
     INNER JOIN (SELECT franklin_object.id     AS franklin_object_id, 
          franklin_object.type     AS franklin_object_type, 
          franklin_object.uuid     AS franklin_object_uuid, 
          content_text_block.id     AS content_text_block_id, 
          content_text_block.text    AS content_text_block_text, 
          content_text_block.position   AS content_text_block_position, 
          content_text_block.franklin_object_id AS content_text_block_franklin_object_id, 
          content_text_block.created_at   AS content_text_block_created_at, 
          content_text_block.updated_at   AS content_text_block_updated_at 
        FROM franklin_object 
          INNER JOIN content_text_block 
            ON franklin_object.id = content_text_block.id) AS anon_1 
       ON stream_item.id = anon_1.content_text_block_franklin_object_id 
     LEFT OUTER JOIN contents_resources AS contents_resources_1 
        ON anon_1.content_text_block_id = contents_resources_1.content_id 
     LEFT OUTER JOIN (SELECT franklin_object.id   AS franklin_object_id, 
           franklin_object.type   AS franklin_object_type, 
           franklin_object.uuid   AS franklin_object_uuid, 
           resource.id     AS resource_id, 
           resource.top_parent_resource AS resource_top_parent_resource, 
           resource.top_parent_id  AS resource_top_parent_id, 
           resource.title    AS resource_title, 
           resource.url     AS resource_url, 
           resource.image    AS resource_image, 
           resource.created_at   AS resource_created_at, 
           resource.updated_at   AS resource_updated_at 
         FROM franklin_object 
           INNER JOIN resource 
             ON franklin_object.id = resource.id) AS anon_2 
        ON anon_2.resource_id = contents_resources_1.resource_id 
     LEFT OUTER JOIN contents_franklin_objects AS contents_franklin_objects_1 
        ON anon_1.content_text_block_id = contents_franklin_objects_1.content_id 
     LEFT OUTER JOIN franklin_object AS franklin_object_1 
        ON franklin_object_1.id = contents_franklin_objects_1.franklin_object_id 
     LEFT OUTER JOIN likers AS likers_1 
        ON stream_item.id = likers_1.post_id 
     LEFT OUTER JOIN (SELECT franklin_object.id   AS franklin_object_id, 
           franklin_object.type  AS franklin_object_type, 
           franklin_object.uuid  AS franklin_object_uuid, 
           USER.id     AS user_id, 
           USER.email     AS user_email, 
           USER.password    AS user_password, 
           USER.auth_token   AS user_auth_token, 
           USER.auth_token_expiration AS user_auth_token_expiration, 
           USER.active    AS user_active, 
           USER.activation_token  AS user_activation_token, 
           USER.first_name   AS user_first_name, 
           USER.last_name    AS user_last_name, 
           USER.image     AS user_image, 
           USER.bio     AS user_bio, 
           USER.aspirations   AS user_aspirations, 
           USER.website    AS user_website, 
           USER.resume    AS user_resume, 
           USER.resume_name   AS user_resume_name, 
           USER.primary_role   AS user_primary_role, 
           USER.institution_id  AS user_institution_id, 
           USER.birth_date   AS user_birth_date, 
           USER.gender    AS user_gender, 
           USER.graduation_year  AS user_graduation_year, 
           USER.complete    AS user_complete, 
           USER.masthead_y_position AS user_masthead_y_position, 
           USER.masthead    AS user_masthead, 
           USER.fb_access_token  AS user_fb_access_token, 
           USER.fb_user_id   AS user_fb_user_id, 
           USER.location    AS user_location, 
           USER.created_at   AS user_created_at, 
           USER.updated_at   AS user_updated_at 
         FROM franklin_object 
           INNER JOIN USER 
             ON franklin_object.id = USER.id) AS anon_3 
        ON anon_3.user_id = likers_1.user_id 
     LEFT OUTER JOIN contents_franklin_objects AS contents_franklin_objects_2 
        ON franklin_object.id = contents_franklin_objects_2.franklin_object_id 
     LEFT OUTER JOIN (SELECT franklin_object.id     AS franklin_object_id, 
           franklin_object.type     AS franklin_object_type, 
           franklin_object.uuid     AS franklin_object_uuid, 
           content_text_block.id     AS content_text_block_id, 
           content_text_block.text    AS content_text_block_text, 
           content_text_block.position   AS content_text_block_position, 
           content_text_block.franklin_object_id AS content_text_block_franklin_object_id, 
           content_text_block.created_at   AS content_text_block_created_at, 
           content_text_block.updated_at   AS content_text_block_updated_at 
         FROM franklin_object 
           INNER JOIN content_text_block 
             ON franklin_object.id = content_text_block.id) AS anon_4 
        ON anon_4.content_text_block_id = contents_franklin_objects_2.content_id 
     LEFT OUTER JOIN (SELECT franklin_object.id   AS franklin_object_id, 
           franklin_object.type  AS franklin_object_type, 
           franklin_object.uuid  AS franklin_object_uuid, 
           stream_item.id    AS stream_item_id, 
           stream_item.parent_id  AS stream_item_parent_id, 
           stream_item.shown_at  AS stream_item_shown_at, 
           stream_item.author_id  AS stream_item_author_id, 
           stream_item.stream_sort_at AS stream_item_stream_sort_at, 
           stream_item.PUBLIC   AS stream_item_public, 
           stream_item.created_at  AS stream_item_created_at, 
           stream_item.updated_at  AS stream_item_updated_at 
         FROM franklin_object 
           INNER JOIN stream_item 
             ON franklin_object.id = stream_item.id) AS anon_6 
        ON anon_6.stream_item_parent_id = franklin_object.id 
     LEFT OUTER JOIN likers AS likers_2 
        ON anon_6.stream_item_id = likers_2.post_id 
     LEFT OUTER JOIN (SELECT franklin_object.id   AS franklin_object_id, 
           franklin_object.type  AS franklin_object_type, 
           franklin_object.uuid  AS franklin_object_uuid, 
           USER.id     AS user_id, 
           USER.email     AS user_email, 
           USER.password    AS user_password, 
           USER.auth_token   AS user_auth_token, 
           USER.auth_token_expiration AS user_auth_token_expiration, 
           USER.active    AS user_active, 
           USER.activation_token  AS user_activation_token, 
           USER.first_name   AS user_first_name, 
           USER.last_name    AS user_last_name, 
           USER.image     AS user_image, 
           USER.bio     AS user_bio, 
           USER.aspirations   AS user_aspirations, 
           USER.website    AS user_website, 
           USER.resume    AS user_resume, 
           USER.resume_name   AS user_resume_name, 
           USER.primary_role   AS user_primary_role, 
           USER.institution_id  AS user_institution_id, 
           USER.birth_date   AS user_birth_date, 
           USER.gender    AS user_gender, 
           USER.graduation_year  AS user_graduation_year, 
           USER.complete    AS user_complete, 
           USER.masthead_y_position AS user_masthead_y_position, 
           USER.masthead    AS user_masthead, 
           USER.fb_access_token  AS user_fb_access_token, 
           USER.fb_user_id   AS user_fb_user_id, 
           USER.location    AS user_location, 
           USER.created_at   AS user_created_at, 
           USER.updated_at   AS user_updated_at 
         FROM franklin_object 
           INNER JOIN USER 
             ON franklin_object.id = USER.id) AS anon_5 
        ON anon_5.user_id = likers_2.user_id 
WHERE stream_item.parent_id = 11 
ORDER BY stream_item.stream_sort_at DESC, 
      anon_1.content_text_block_position, 
      anon_6.stream_item_stream_sort_at DESC 

करें और बताएं कि उत्पादन:

ID SELECT_TYPE TABLE POSSIBLY_KEYS KEY KEY_LEN REF ROWS EXTRA 
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 599 Using  temporary; Using filesort 
1 PRIMARY stream_item eq_ref PRIMARY,parent_id PRIMARY 4 anon_1.content_text_block_franklin_object_id 1 Using where 
1 PRIMARY contents_resources_1 ref content_id content_id 5 anon_1.content_text_block_id 2 
1 PRIMARY <derived3> ALL NULL NULL NULL NULL 7 
1 PRIMARY contents_franklin_objects_1 ref content_id content_id 5 anon_1.content_text_block_id 1 
1 PRIMARY franklin_object eq_ref PRIMARY PRIMARY 4 franklin.stream_item.id 1 Using where 
1 PRIMARY franklin_object_1 eq_ref PRIMARY PRIMARY 4 franklin.contents_franklin_objects_1.franklin_object_id 1 
1 PRIMARY likers_1 ref post_id post_id 5 franklin.stream_item.id 1 
1 PRIMARY <derived4> ALL NULL NULL NULL NULL 136 
1 PRIMARY contents_franklin_objects_2 ref franklin_object_id franklin_object_id 5 franklin.stream_item.id 1 
1 PRIMARY <derived5> ALL NULL NULL NULL NULL 599 
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 608 
1 PRIMARY likers_2 ref post_id post_id 5 anon_6.stream_item_id 1 
1 PRIMARY <derived7> ALL NULL NULL NULL NULL 136 
7 DERIVED user ALL PRIMARY NULL NULL NULL 133 
7 DERIVED franklin_object eq_ref PRIMARY PRIMARY 4 franklin.user.id 1 
6 DERIVED stream_item ALL PRIMARY NULL NULL NULL 709 
6 DERIVED franklin_object eq_ref PRIMARY PRIMARY 4 franklin.stream_item.id 1 
5 DERIVED content_text_block ALL PRIMARY NULL NULL NULL 666 
5 DERIVED franklin_object eq_ref PRIMARY PRIMARY 4 franklin.content_text_block.id  1 
4 DERIVED user ALL PRIMARY NULL NULL NULL 133 
4 DERIVED franklin_object eq_ref PRIMARY PRIMARY 4 franklin.user.id 1 
3 DERIVED resource ALL PRIMARY NULL NULL NULL 7 
3 DERIVED franklin_object eq_ref PRIMARY PRIMARY 4 franklin.resource.id 1 
2 DERIVED content_text_block ALL PRIMARY NULL NULL NULL 666 
2 DERIVED franklin_object eq_ref PRIMARY PRIMARY 4 franklin.content_text_block.id 1 

कैसे मैं कुछ करने के लिए सभी तरह की पूछताछ के लिए तेजी से कम करते हैं

क्वेरी है? अन्य तरीकों से मैं इसे कैसे तेज कर सकता हूं?

क्या franklin_objects एक एंटीपाटर स्थापित किया गया है? जिस तरह से यह काम करता है वह है कि franklin_object तालिका में दो कॉलम हैं: आईडी और प्रकार। फिर प्रत्येक प्रकार एक तालिका है, प्राथमिक कुंजी के साथ जो franklin_object में एक विदेशी कुंजी है।

stream_item_query = StreamItem.query.options(db.joinedload('stream_items'),db.joinedload('contents_included_in'),db.joinedload('contents.resources'),db.joinedload('contents.objects'),db.subqueryload('likers'))

stream_items = stream_item_query.filter(StreamItem.parent_id == community_id).order_by(db.desc(StreamItem.stream_sort_at)).all()

+0

उपरोक्त ओआरएम कोड जोड़ा गया। –

+0

क्या आपकी कक्षाएं टेबल्स में मैप की गई हैं या कई टेबलों में स्टेटमंट का चयन करने के लिए हैं? जॉइन एक तरह से अजीब 'शामिल होते हैं (एक शामिल बी से चुनें *) मैं जो अपेक्षा करता हूं उसके बारे में बताता हूं,' मैं शामिल हूं ' – SingleNegationElimination

+0

प्रत्येक वर्ग को फ्रैंकलिन ऑब्जेक्ट से विरासत में मिला (विरासत में शामिल)। –

उत्तर

4

मेरे मस्तिष्क वाह, यह एक चोट एक छोटे से:

कोड है कि एसक्यूएल उत्पन्न करता है, की तर्ज पर कुछ न कुछ है। यह पता लगाने की कोशिश कर रहा है कि क्वेरी क्या कर रही है, सभी टेबल क्या हैं, और रिश्तों को थकाऊ था। यदि आपके पास एक समान अनुभव है, तो यह पहला संकेत है कि आप शायद इस एकल क्वेरी में बहुत कुछ करने की कोशिश कर रहे हैं।

मेरा सुझाव है कि आप अपने पूरे दृष्टिकोण पर पुनर्विचार करें।

SQLAlchemy एक बहुत अच्छा टूल है, और मैं इसे (या MySQL की अपनी पसंद) को बाश नहीं कर रहा हूं, लेकिन अधिकांश ओआरएम उपकरणों के साथ आपको उनके उपयोग के साथ लागत पर विचार करने की आवश्यकता है। एक उदाहरण यह franklin_object टेबल व्यवसाय है। क्या यह एक विरोधी पैटर्न है? हां और नहीं। यह पूरी तरह से ओओ परिप्रेक्ष्य से समझ में आता है। इस तालिका में id देख कर आप कौन सी तालिकाओं को क्वेरी कर सकते हैं। एक संबंधपरक पूछताछ परिप्रेक्ष्य से, यह बहुत कम उद्देश्य प्रदान करता है। मैं आपकी क्वेरी से franklin_object के प्रत्येक इंस्टेंस को हटा सकता हूं और कुछ भी नहीं खो सकता ... franklin_object से कॉलम। यदि यह एक व्यवहार्य विकल्प है, तो मैं इसे तुरंत कर दूंगा।

चलिए franklin_object के साथ इस लिंकिंग की जांच करें।उप प्रश्नों को देखते हुए, वे सभी एक ही रूप है:

SELECT franklin_object.id   AS franklin_object_id, 
     franklin_object.type   AS franklin_object_type, 
     franklin_object.uuid   AS franklin_object_uuid, 
     linked_table.id    AS linked_table_id, 
     linked_table.col2   AS col2 --and more 
    FROM franklin_object 
    INNER JOIN linked_table 
     ON franklin_object.id = linked_table.id) AS anon_n 

वहाँ अधिक से अधिक जानकारी डेटाबेस के रूप में अब तक कैसे क्वेरी के इस हिस्से का अनुकूलन करने के रूप में पर जाने के लिए के लिए, सांख्यिकी की परवाह किए बिना नहीं है। शायद franklin_object को where खंड में निर्दिष्ट करके सीमित किया गया था, तो क्वेरी बेहतर होगी। शायद।

यह विशेष रूप से उपयोगकर्ता तालिका के साथ समस्याग्रस्त है, क्योंकि इस तालिका में बहुत सारे रिकॉर्ड हैं (इसलिए आप कहते हैं)। चूंकि आप अधिकांश कॉलम से पूछताछ कर रहे हैं, और ऑप्टिमाइज़र सटीक रूप से यह नहीं समझ सकता कि कितनी पंक्तियां पुनर्प्राप्त की जाएंगी, यह समझ में आता है कि एक पूर्ण टेबल स्कैन किया जाना चाहिए। आपके मामले में, दो बार।

एक और पहलू शामिल शामिल होने की बड़ी संख्या है। अगर हम सभी franklin_object संदर्भ लेते हैं, तो अभी भी 11 शामिल हैं। यह भयानक नहीं है, अगर आपका डेटा मॉडल अधिक रिलेशनल था, लेकिन ऐसा नहीं है। उत्पन्न क्वेरी क्वेरी करने के लिए सबसे अच्छा तरीका जानने के लिए डेटाबेस को बहुत मदद नहीं देती है, और इसलिए यह अच्छी नौकरी नहीं करता है। हो सकता है कि आप संकेतों के साथ इसे कम कर सकें, लेकिन मुझे यकीन है कि यह आपको लंबे समय तक काट देगा।

आप एक ओआरएम उपकरण का उपयोग कर रहे हैं, इसलिए वास्तव में का उपयोग करें। आपको एक ही बार में इतनी बड़ी पूछताछ करके कुछ हासिल नहीं होता है। इसे प्रदर्शन के लिए थोड़ा सा विभाजित किया जा सकता है। विशाल, जटिल प्रश्नों से बचने के लिए आलसी पुनर्प्राप्ति करें। मैं कोशिश करता हूं, यह देखने के लिए कि यह कैसे चल रहा है, सब कुछ आलसी करने के लिए। प्रदर्शन ठीक रहेगा, मैं बेहतर कहूंगा। बहुत अच्छा नहीं, शायद स्वीकार्य भी नहीं, लेकिन डाटाबेस मंथन करते समय कॉफी पाने में सक्षम होने से बेहतर है।

फिर, चीजों को अधिक सुव्यवस्थित हिस्सों में एक साथ जोड़ना शुरू करें। resource और contents_resources जैसे तर्कसंगत रूप से समझने वाली वस्तुओं को एक साथ बांधें। एक और उदाहरण, stream_item, likers और user के बीच कनेक्शन डुप्लिकेट किया गया है। उस प्रश्न को बनाएं और स्क्लेक्लेमी को अपनी बात दें।

अंतिम उपाय के रूप में, किसी प्रकार का कैशिंग तंत्र लागू किया जा सकता है। शायद कहीं भी टेबल को denormalize। एक धीमी-बदलती, पढ़ने-भारी प्रणाली पर आप इन तालिकाओं को दूसरी संरचना में खिला सकते हैं जहां प्रश्न सीधे-आगे और तेज़ होते हैं। यही है, प्रसंस्करण अप-फ्रंट करने के लिए और इसे एक ही टेबल में स्टोर करें।

अच्छी किस्मत

संबंधित मुद्दे