कृपया 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