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

दिनांक विवरण के अनुसार ऑर्डर करते समय, अस्थायी रूप से क्वेरी को धीमा कर देता है

मुझे लगता है, यहां और इसी तरह के प्रश्नों में अधिकांश समस्याएं गलतफहमी से आती हैं कि कैसे MySQL (और अन्य डेटाबेस) सॉर्टिंग के लिए इंडेक्स का उपयोग करता है। उत्तर है:MySQL सॉर्टिंग के लिए इंडेक्स का उपयोग नहीं करता है, यह केवल इंडेक्स के क्रम में या विपरीत दिशा में डेटा पढ़ सकता है। यदि आप चाहते हैं कि डेटा को वर्तमान में उपयोग किए गए इंडेक्स के क्रम में व्यवस्थित किया जाए - आप भाग्यशाली हैं, अन्यथा परिणाम सॉर्ट किया जाएगा (इसलिए EXPLAIN में फाइल सॉर्ट करें)

यानी पूरे परिणाम का क्रम ज्यादातर इस बात पर निर्भर करता है कि कौन सी तालिका शामिल होने में सबसे पहले थी। और यदि आप अपने EXPLAIN को देखें तो आप देखेंगे कि जुड़ाव 'log_codes' तालिका से शुरू होता है (क्योंकि यह बहुत छोटा है)।

मूल रूप से, आपको 'log_entries' पर एक समग्र अनुक्रमणिका (partner_id, date) की आवश्यकता है, 'log_codes' के लिए एक कवरिंग समग्र अनुक्रमणिका (log_code, category_overview, log_desc), 'INNER JOIN' को 'STRAIGHT_JOIN' में बदलने के आदेश को बाध्य करने के लिए, और 'तारीख' डीईएससी द्वारा आदेश (यह सूचकांक सौभाग्य से भी कवर किया जाएगा)।

UPD1 :मुझे खेद है, मैंने पहली तालिका के लिए सूचकांक गलत टाइप किया:यह (partner_id, log_code, date) होना चाहिए ।

MySQL या तो सीधे डेटा आउटपुट कर सकता है जब तक आप इसे प्राप्त करने के क्रम से सहमत होते हैं, या डेटा को एक अस्थायी तालिका में डालते हैं, तब सॉर्टिंग और आउटपुट लागू करते हैं। जब आप जॉइन में किसी गैर-प्रथम तालिका से किसी फ़ील्ड द्वारा ऑर्डर करते हैं, तो MySQL को डेटा सॉर्ट करना होता है (न कि केवल इंडेक्स के क्रम में आउटपुट) और डेटा को सॉर्ट करने के लिए इसे एक अस्थायी तालिका की आवश्यकता होती है।

50000,25 पंक्तियों को आउटपुट करने के लिए MySQL को वैसे भी पहले 50000 लाने और उन्हें छोड़ने की आवश्यकता है। चूंकि मैं इंडेक्स में एक कॉलम से चूक गया, MySQL ने न केवल इंडेक्स को स्कैन किया बल्कि प्रत्येक आइटम के लिए log_code के लिए डिस्क लुकअप पर एक अतिरिक्त बनाया। मूल्य। कवरिंग इंडेक्स के साथ जो बहुत तेज होना चाहिए, क्योंकि सभी डेटा इंडेक्स से प्राप्त किए जा सकते हैं।

UPD2 :अनुक्रमणिका को बाध्य करने का प्रयास करें:

SELECT log_entries.date, log_codes.log_desc
FROM log_entries FORCE INDEX (IX_partner_code_date)
STRAIGHT_JOIN log_codes
  ON log_codes.log_code = log_entries.log_code
WHERE log_entries.partner_id = 1
  AND log_codes.category_overview = 1
ORDER BY log_entries.date DESC;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Percona XtraBackup की तुलना MySQL एंटरप्राइज़ बैकअप से करना:भाग एक

  2. mysql तालिका से रैंक की गणना कैसे करें

  3. MySQL समवर्ती अद्यतन

  4. परीक्षण फ़ाइल कम परीक्षण प्रारंभ सर्वर नहीं बना सकता mysql

  5. Mysql में दो उपयोगकर्ता के संचार के बीच नवीनतम संदेश का चयन करें