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

MySQL क्वेरी परिणाम को फ़िल्टर करना एक विशिष्ट अवधि के भीतर कई अवसर उत्पन्न करने के लिए सेट है

यदि हम उन पंक्तियों को फ़िल्टर करना चाहते हैं जहाँ पिछले 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 क्वेरी के लिए कौन सी अनुक्रमणिका का उपयोग कर रहा है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Android से SQLite डेटाबेस को MySQL डेटाबेस में कॉपी कैसे करें (प्रतिकृति/सिंक)

  2. सिंगल कमांड में सर्वर से सर्वर पर माइस्क्ल कॉपी डेटाबेस

  3. MySql में विदेशी कुंजियाँ बनाने में समस्या

  4. सरल एसक्यूएल क्वेरी, परिणाम गठबंधन करें और विभाजित करें

  5. MySQL फुल जॉइन काम नहीं कर रहा है लेकिन राइट और लेफ्ट जॉइन काम करता है