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

अस्थायी का उपयोग करके mysql प्रदर्शन में योजना की व्याख्या करें; फाइलसॉर्ट का उपयोग करना; इंडेक्स कंडीशन का उपयोग करना

कृपया SHOW CREATE TABLE provide प्रदान करें ।

मुख्य फ़िल्टर लगता है

            where  dsr_booking_date BETWEEN '2017-05-01' AND '2017-06-30'
              AND  LENGTH(dsr_cnno)=9
              AND  DSR_BOOKED_BY ='F'
              AND  dsr_status<>'R'
              AND  dsr_cnno NOT LIKE 'J%'
              AND  dsr_cnno NOT LIKE '@%'
              AND  dsr_cnno NOT LIKE '576%'
              AND  dsr_cnno NOT LIKE 'I3%'
              AND  dsr_cnno NOT LIKE '7%'
              AND  dsr_cnno NOT LIKE 'N%'
              and  d.dsr_dest_pin>0

शायद इसके लिए एकमात्र उपयोगी सूचकांक इस क्रम में है:

INDEX(DSR_BOOKED_BY, dsr_booking_date)

जैसी चीज़ें

ifnull((select max(ndsr_ins_amt)     from ndx_dsr_table where ndsr_cnno=dsr_cnno ),0)-
ifnull((select max(ndsr_serv_charge) from ndx_dsr_table where ndsr_cnno=dsr_cnno ),0) -

शायद एक साथ किया जाना चाहिए। कुछ इस तरह पर विचार करें

ifnull(mm.max_nia), 0) -
ifnull(mm.max_nsc), 0) .
...
LEFT JOIN ( SELECT max(ndsr_ins_amt)     AS max_nia,
                   max(ndsr_serv_charge) AS max_nsc
                from ndx_dsr_table
          ) AS mm  ON ndsr_cnno=dsr_cnno

या, यदि आवश्यक हो, तो उस सबक्वेरी के साथ एक अस्थायी तालिका बनाएं, फिर उसमें शामिल हों।

(चूंकि आपने प्रत्येक कॉलम को उस तालिका के साथ योग्य नहीं बनाया है जिसमें वह है, मैं अधिक विशिष्ट नहीं हो सकता।)

क्या आपके पास विभिन्न JOINs . के लिए उपयुक्त 'समग्र' अनुक्रमणिकाएं हैं? ?

EXPLAIN . के अनुसार , यह dsr_table . की 182M पंक्तियों को स्कैन कर रहा है . तो, मेरी अनुक्रमणिका, ऊपर, मदद करने की संभावना है (यदि आपके पास पहले से ऐसा नहीं है।)

मैं इतनी लंबी अनुक्रमणिका का सुझाव देने में संकोच करता हूं, लेकिन इससे मदद मिल सकती है:

INDEX(DSR_BOOKED_BY, dsr_booking_date,  -- these first, in this order
      dsr_cnno, dsr_status, dsr_cnno, dsr_dist_pin,  -- in any order
      id)   -- (whatever the PK of the table is); last

दूसरी क्वेरी में खराब समस्या

        WHERE  dsr_booking_date = '2017-04-30'
          AND  '2017-05-30'

शायद आपका मतलब 31 दिन था:

        WHERE  dsr_booking_date BETWEEN '2017-04-30'
                                   AND  '2017-05-30'

या शायद 2 दिन:

        WHERE  dsr_booking_date IN ('2017-04-30', '2017-05-30')

आपके पास क्या है

        WHERE  dsr_booking_date = '2017-04-30'  -- test for one day
          AND  true  -- that's how '2017-05-30' is interpreted



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP क्वेरी पर अटक गया

  2. UTF-8 सभी तरह से

  3. PHP सरणी का उपयोग करके MYSQL में डेटा डालें

  4. JSON और सर्वर पर छवि अपलोड करें

  5. PHP के साथ डेटाबेस में ड्रॉपडाउन से डेटा सम्मिलित करना