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

मैसकल कवरिंग बनाम कंपोजिट बनाम कॉलम इंडेक्स

एक कवरिंग इंडेक्स एक समग्र इंडेक्स के समान नहीं है।

<ब्लॉकक्वॉट>

यदि मेरे पास col3 पर 2 अलग-अलग अनुक्रमणिकाएं हैं और दूसरी col4 पर हैं, तो इस क्वेरी में उनमें से किसका उपयोग किया जाएगा?

उच्चतम कार्डिनैलिटी वाला सूचकांक।
MySQL आंकड़े रखता है कि किस सूचकांक में कौन से गुण हैं।
जिस सूचकांक में सबसे अधिक विभेदक शक्ति है (जैसा कि MySQL के आंकड़ों में स्पष्ट है) का उपयोग किया जाएगा।

<ब्लॉकक्वॉट>

मैंने कहीं पढ़ा है कि क्वेरी में प्रत्येक तालिका के लिए केवल एक अनुक्रमणिका का उपयोग किया जाता है। क्या इसका मतलब यह है कि क्वेरी के लिए दोनों इंडेक्स का इस्तेमाल करने का कोई तरीका नहीं है?

आप उप-चयन का उपयोग कर सकते हैं।
या इससे भी बेहतर एक मिश्रित अनुक्रमणिका का उपयोग करें जिसमें col3 और col4 दोनों शामिल हों।

<ब्लॉकक्वॉट>

दूसरे, अगर मैंने col3 और col4 दोनों का एक साथ उपयोग करके एक समग्र सूचकांक बनाया है, लेकिन WHERE क्लॉज में केवल col3 का उपयोग किया है, तो क्या यह प्रदर्शन के लिए बदतर होगा? उदाहरण:

यौगिक अनुक्रमणिका
सही शब्द है compound अनुक्रमणिका, मिश्रित नहीं।
केवल सबसे बाएं मिश्रित अनुक्रमणिका के भाग का उपयोग किया जाएगा।
इसलिए यदि अनुक्रमणिका को

. के रूप में परिभाषित किया गया है
index myindex (col3, col4)  <<-- will work with your example.
index myindex (col4, col3)  <<-- will not work. 

देखें:http://dev.mysql.com /doc/refman/5.0/hi/multiple-column-indexes.html

ध्यान दें कि यदि आप सबसे बाईं ओर वाले फ़ील्ड का चयन करते हैं, तो आप अपने जहाँ क्लॉज़ में अनुक्रमणिका के उस भाग का उपयोग न करने से बच सकते हैं।
कल्पना कीजिए कि हमारे पास एक मिश्रित अनुक्रमणिका है

Myindex(col1,col2)

SELECT col1 FROM table1 WHERE col2 = 200  <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200     <<-- will NOT use index.  

इसके काम करने का कारण यह है कि पहली क्वेरी कवरिंग इंडेक्स का उपयोग करती है और उस पर एक स्कैन करती है। केवल InnoDB में काम करता है।

कवरिंग इंडेक्स क्या होता है
एक कवरिंग इंडेक्स उस मामले को संदर्भित करता है जब किसी क्वेरी में चयनित सभी फ़ील्ड covered . होते हैं एक इंडेक्स द्वारा, उस स्थिति में InnoDB (MyISAM नहीं) तालिका में डेटा को कभी नहीं पढ़ेगा, लेकिन केवल इंडेक्स में डेटा का उपयोग करेगा, चयन को काफी तेज करेगा।
ध्यान दें कि InnoDB में प्राथमिक कुंजी शामिल है सभी सेकेंडरी इंडेक्स, इसलिए एक तरह से सभी सेकेंडरी इंडेक्स कंपाउंड इंडेक्स हैं।
इसका मतलब है कि अगर आप इनो डीबी पर निम्नलिखित क्वेरी चलाते हैं:

SELECT indexed_field FROM table1 WHERE pk = something

<स्ट्राइक>MySQL हमेशा एक कवरिंग इंडेक्स का उपयोग करेगा और वास्तविक टेबल तक नहीं पहुंचेगा। हालांकि यह एक कवरिंग इंडेक्स का उपयोग कर सकता है, यह PRIMARY KEY को प्राथमिकता देगा क्योंकि इसे केवल एक ही पंक्ति को हिट करने की आवश्यकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ClusterControl के साथ MySQL के प्रदर्शन की निगरानी करना

  2. MySQL में तारीखों के बीच महीनों का अंतर

  3. एसक्यूएल दो टेबल्स से आंतरिक जुड़ने और सीमा के साथ चयन

  4. mysql रूट पासवर्ड भूल गया

  5. DAYNAME () उदाहरण – MySQL