Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Rows_sent:12 Rows_examined:549024 - mySQL क्वेरी को ऑप्टिमाइज़ कैसे करें?

सबसे पहले, आपकी क्वेरी में कोई समस्या है। आप लेफ्ट जॉइन का उपयोग करते हैं, लेकिन आप अपने जहां क्लॉज के साथ एक अंतर्निहित इनर जॉइन में बदल जाते हैं:और (a.list_in='store' OR u.shop_active='1')

यह बाएं जॉइन को एक अंतर्निहित आंतरिक में क्यों बदल देता है? चूंकि कोई मेल खाने वाला उपयोगकर्ता नहीं होने पर LEFT JOIN u.shop_active के लिए NULL मान उत्पन्न करेगा, लेकिन NULL कभी भी '1' के बराबर नहीं होगा। यह क्वेरी को एक INNER JOIN में बदल देता है क्योंकि OUTER JOIN द्वारा निर्मित किसी भी पंक्ति को WHERE कंडीशन द्वारा फ़िल्टर किया जाएगा।

यह फ़िल्टर भी प्रदर्शन समस्या का कारण है। आपके पास दो अलग-अलग तालिकाओं में स्तंभों के बीच एक OR शर्त है। ऐसी कोई भी अनुक्रमणिका नहीं है जो ऐसी शर्त को पूरा कर सके।

यहां एक और तरीका है जो बेहतर प्रदर्शन कर सकता है। यह संस्करण केवल उन लिस्टिंग की खोज करेगा जहां (a.list_in !='store' and u.shop_active ='1') जब 12 से कम list_in='store' लिस्टिंग हैं।

निम्न का उपयोग करने के लिए, सुनिश्चित करें कि आपके पास एक अनुक्रमणिका है (list_in, end_time)

SELECT * FROM
(
    SELECT a.listing_id, a.name, a.item_price, a.max, a.nb, a.currency,
           a.end_time, a.closed, a.bold, a.hl, a.buy_price, a.is_offer, a.reserve,
           a.owner_id, a.postage_amount, a.fb_current_bid, a.type, a.start_time,
           a.is_relisted_item, a.enable
     FROM db_listings a
    WHERE list_in = 'store'
     a.active=1 AND
     a.approved=1 AND 
     a.deleted=0 AND 
     a.creation_in_progress=0 AND
     a.closed=0
    ORDER BY end_time 
    LIMIT 12 
    )
    UNION ALL
    (
        SELECT a.listing_id, a.name, a.item_price, a.max, a.nb, a.currency,
           a.end_time, a.closed, a.bold, a.hl, a.buy_price, a.is_offer, a.reserve,
           a.owner_id, a.postage_amount, a.fb_current_bid, a.type, a.start_time,
           a.is_relisted_item, a.enable
        FROM db_listings a
        JOIN users u 
          ON a.owner_id = u.user_id
         AND u.shop_active = '1'
       WHERE list_in != 'store' AND
       a.active=1 AND
       a.approved=1 AND 
       a.deleted=0 AND 
       a.creation_in_progress=0 AND
       a.closed=0
       ORDER BY end_time 
       LIMIT 12 
    )
) sq
ORDER BY list_in, end_time
LIMIT 12;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. प्रश्न और उत्तर तालिका में शामिल होने वाले रिकॉर्ड गिनें

  2. डालने से पहले पहले से मौजूद रिकॉर्ड की जांच करने का सबसे तेज़ तरीका [mysql_errno ()]

  3. Mysql:विदेशी कुंजी जोड़ने से MyISAM तालिकाओं पर चेतावनी/त्रुटि नहीं मिलती है

  4. MySQL खंड के बीच में DATE_SUB का उपयोग कैसे करें

  5. किसी अन्य संग्रहीत कार्यविधि में mysql संग्रहीत कार्यविधि के परिणाम सेट का उपयोग करें