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

फुलटेक्स्ट और कंपोजिट इंडेक्स और वे क्वेरी को कैसे प्रभावित करते हैं

अगर मैं आपका प्रश्न समझता हूं, तो आप जानते हैं कि MATCH AGAINST आपके FULLTEXT इंडेक्स का उपयोग करता है और आप सोच रहे हैं कि MySQL बाकी WHERE क्लॉज को कैसे लागू करता है (यानी क्या यह टेबलस्कैन या इंडेक्स लुकअप करता है)।

यहाँ मैं आपकी तालिका के बारे में क्या मान रहा हूँ:इसमें कुछ id कॉलम और FULLTEXT अनुक्रमणिका पर एक प्राथमिक कुंजी है।

तो सबसे पहले, MySQL कभी नहीं शहर/राज्य WHERE क्लॉज के लिए FULLTEXT इंडेक्स का उपयोग करें। क्यों? क्योंकि FULLTEXT इंडेक्स केवल MATCH AGAINST के साथ लागू होते हैं। देखें यहां पैराग्राफ में गोलियों के पहले सेट के बाद (सामग्री की तालिका बुलेट नहीं)।

संपादित करें: आपके मामले में, यह मानते हुए कि आपकी तालिका में केवल 10 पंक्तियाँ नहीं हैं, MySQL आपके MATCH AGAINST के लिए FULLTEXT अनुक्रमणिका लागू करेगा, फिर शहर/राज्य को लागू करने के लिए उन परिणामों पर एक टेबलस्कैन करें।

तो क्या होगा अगर आप शहर और राज्य में एक BTREE इंडेक्स जोड़ते हैं?

CREATE INDEX city__state ON table (city(10),state(2)) USING BTREE;

वैसे MySQL केवल एक . का उपयोग कर सकता है इस क्वेरी के लिए अनुक्रमणिका क्योंकि यह एक साधारण चयन है। यह या तो . होगा FULLTEXT या . का उपयोग करें बीटीआरई। ध्यान दें कि जब मैं एक इंडेक्स कहता हूं, तो मेरा मतलब एक इंडेक्स डेफिनिशन होता है, मल्टी-पार्ट इंडेक्स में एक कॉलम नहीं। खैर, इसके बाद यह सवाल उठता है कि कौन करता है इसका उपयोग करते हैं?

यह तालिका विश्लेषण पर निर्भर करता है। MySQL अनुमान का प्रयास करेगा (अंतिम OPTIMIZE TABLE से तालिका के आँकड़ों के आधार पर) कौन सा सूचकांक सबसे अधिक रिकॉर्ड काटेगा। यदि शहर/राज्य जहां आपको 10 रिकॉर्ड तक ले जाता है, जबकि MATCH AGAINST आपको केवल 100 तक नीचे ले जाता है, तो MySQL शहर_राज्य सूचकांक का उपयोग करेगा पहले शहर/राज्य के लिए WHERE और फिर MATCH AGAINST के लिए एक टेबलस्कैन करें।

दूसरी ओर, यदि MATCH_AGAINST आपको 10 रिकॉर्ड तक ले जाता है, जबकि शहर/राज्य WHERE आपको केवल 1000 तक ले जाता है, तो MySQL पहले FULLTEXT इंडेक्स और शहर और राज्य के लिए टेबलस्कैन लागू करेगा।

लब्बोलुआब यह है कि कार्डिनैलिटी आपके सूचकांक का। अनिवार्य रूप से, आपके सूचकांक में जाने वाले मूल्य कितने अद्वितीय हैं? यदि आपकी तालिका के प्रत्येक रिकॉर्ड में शहर को ओकलैंड पर सेट किया गया है, तो यह एक बहुत ही अनोखी कुंजी नहीं है और इसलिए शहर ='ओकलैंड' है। वास्तव में आपके लिए रिकॉर्ड की संख्या को इतना कम नहीं करता है। उस स्थिति में, हम कहते हैं कि आपके शहर_राज्य सूचकांक में कम कार्डिनैलिटी . है ।

नतीजतन यदि आपके FULLTEXT इंडेक्स में 90% शब्द "जॉन" हैं, तो यह वास्तव में ठीक उन्हीं कारणों से आपकी बहुत मदद नहीं करता है।

यदि आप स्थान और UPDATE/DELETE/INSERT ओवरहेड का खर्च उठा सकते हैं, तो मैं BTREE इंडेक्स जोड़ने और MySQL को यह तय करने की सलाह दूंगा कि वह किस इंडेक्स का उपयोग करना चाहता है। मेरे अनुभव में, वह आमतौर पर सही चुनने का बहुत अच्छा काम करता है।

मुझे उम्मीद है इससे आपको अपने प्रश्न का उत्तर मिल गया।

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

संपादित करें2: MySQL की क्वेरी योजना (अनुमान) जिसके लिए अनुक्रमणिका सबसे अधिक रिकॉर्ड काटती है, वह वही है जो आप EXPLAIN में देखते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अद्वितीय कॉलम पर डुप्लिकेट यूनिकोड प्रविष्टि त्रुटि - mysql

  2. MySQL क्वेरी मानों की सूची

  3. लंबे समय तक चलने वाले प्रश्नों (MySql), Apache Tomcat DataSource को स्वचालित रूप से मारें

  4. क्या XA/JTA लेनदेन अभी भी उपयोग किए जाते हैं?

  5. नवीनतम उत्तर के समय तक फ़ोरम पोस्ट व्यवस्थित करें