यदि हम उन पंक्तियों को फ़िल्टर करना चाहते हैं जहाँ पिछले 60 सेकंड के भीतर कम से कम चार पूर्ववर्ती पंक्तियाँ नहीं हैं, यह मानते हुए कि dateTimeOrigination पूर्णांक प्रकार है, एक 32-बिट यूनिक्स-शैली टाइमस्टैम्प, हम कुछ ऐसा कर सकते हैं:
SELECT FROM_UNIXTIME(r.dateTimeOrigination) AS dateTimeOrigination
, r.callingPartyNumber
, r.originalCalledPartyNumber
, r.finalCalledPartyNumber
, r.duration
, r.origDeviceName
, r.destDeviceName
FROM cdr_records r
WHERE r.dateTimeOrigination >= UNIX_TIMESTAMP('2016-05-20')
AND r.dateTimeOrigination < UNIX_TIMESTAMP('2016-05-21')
AND r.callingPartyNumber NOT LIKE 'b00%'
AND r.originalCalledPartyNumber NOT LIKE 'b00%'
AND r.finalCalledPartyNumber NOT LIKE 'b00%'
AND ( SELECT COUNT(1)
FROM cdr_records c
WHERE c.originalCalledPartyNumber = r.originalCalledPartyNumber
AND c.dateTimeOrigination > r.dateTimeOrigination - 60
AND c.dateTimeOrigination <= r.dateTimeOrigination
) > 4
ORDER
BY r.originalCalledPartyNumber
, r.dateTimeOrigination
नोट:प्रदर्शन के लिए, हम नंगे स्तंभों पर विधेय रखना पसंद करते हैं।
इस तरह के एक फॉर्म के साथ, एक अभिव्यक्ति में लिपटे कॉलम के साथ:
WHERE FROM_UNIXTIME(r.dateTimeOrigination) LIKE '2016-05-20%'
MySQL हर . के लिए फ़ंक्शन का मूल्यांकन करेगा तालिका में पंक्ति, और फिर फ़ंक्शन से शाब्दिक से वापसी की तुलना करें।
इस तरह के फ़ॉर्म के साथ:
WHERE r.dateTimeOrigination >= UNIX_TIMESTAMP('2016-05-20')
AND r.dateTimeOrigination < UNIX_TIMESTAMP('2016-05-21')
MySQL दाईं ओर के भावों का मूल्यांकन करेगा एक समय, शाब्दिक . के रूप में . जो MySQL को उपयुक्त इंडेक्स पर रेंज स्कैन ऑपरेशन का प्रभावी उपयोग करने की अनुमति देता है।
अनुसरण करें
बाहरी क्वेरी के सर्वश्रेष्ठ प्रदर्शन के लिए, सबसे अच्छा सूचकांक संभवतः दिनांक समय के प्रमुख कॉलम के साथ एक इंडेक्स होगा, जिसमें अधिमानतः
होगा।... ON cdr_records (dateTimeOrigination
,callingPartyNumber,originalCalledPartyNumber,finalCalledPartyNumber)
सर्वोत्तम प्रदर्शन के लिए, एक कवरिंग इंडेक्स, अंतर्निहित तालिका में पृष्ठों को देखने से बचने के लिए। उदाहरण के लिए:
... ON cdr_records (dateTimeOrigination
,callingPartyNumber,originalCalledPartyNumber,finalCalledPartyNumber
,duration,origDeviceName,destDeviceName)
इसके साथ, हम उम्मीद करेंगे कि EXPLAIN "इंडेक्स का उपयोग" दिखाएगा।
सहसंबद्ध उपश्रेणी के लिए, हम इस तरह के प्रमुख स्तंभों के साथ एक अनुक्रमणिका चाहते हैं:
... ON cdr_records (originalCalledPartyNumber,dateTimeOrigination)
मैं दृढ़ता से अनुशंसा करता हूं कि आप EXPLAIN से आउटपुट देखें, यह देखने के लिए कि MySQL क्वेरी के लिए कौन सी अनुक्रमणिका का उपयोग कर रहा है।