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

MySQL में कंपाउंड FULLTEXT इंडेक्स

@Alden Quimby का उत्तर जहाँ तक जाता है सही है, लेकिन कहानी में और भी बहुत कुछ है, क्योंकि MySQL केवल कोशिश करेगा इष्टतम इंडेक्स चुनने के लिए, और उस निर्धारण को करने की क्षमता सीमित है क्योंकि फुलटेक्स्ट इंडेक्स ऑप्टिमाइज़र के साथ इंटरैक्ट करते हैं।

असल में ऐसा क्या होता है:

यदि निर्दिष्ट user_id तालिका में 0 या 1 मिलान वाली पंक्तियों में मौजूद है, तो अनुकूलक को इसका एहसास होगा और वह उस क्वेरी के लिए user_id को अनुक्रमणिका के रूप में चुनेगा। तेजी से निष्पादन।

अन्यथा, ऑप्टिमाइज़र फ़ुलटेक्स्ट इंडेक्स का चयन करेगा, फ़ुलटेक्स्ट इंडेक्स से मेल खाने वाली प्रत्येक पंक्ति को फ़िल्टर करके उन पंक्तियों को समाप्त करने के लिए जिसमें उपयोगकर्ता_आईडी शामिल नहीं है जो WHERE क्लॉज से मेल खाती है। इतना तेज़ नहीं।

तो यह वास्तव में "इष्टतम" पथ नहीं है। यह पूर्ण टेक्स्ट की तरह है, एक शर्त के तहत पूर्ण टेक्स्ट खोज से बचने के लिए एक अच्छा अनुकूलन के साथ कि हम जानते हैं कि तालिका में लगभग कुछ भी रूचि नहीं है।

इसके टूटने का कारण यह है कि फुलटेक्स्ट इंडेक्स ऑप्टिमाइज़र को कोई सार्थक आंकड़े वापस नहीं देता है। यह सिर्फ कहता है "हाँ, मुझे लगता है कि क्वेरी के लिए शायद मुझे केवल 1 पंक्ति की जांच करने की आवश्यकता होनी चाहिए" ... मूल्य भी तुलनात्मक रूप से कम या कम आता है।

फिर भी, इसका मतलब यह नहीं है कि मैं इसे पहले इस तरह से नहीं आज़माऊँगा।

एक और विकल्प है, जो पूर्ण टेक्स्ट प्रश्नों के साथ सबसे अच्छा काम करेगा IN BOOLEAN MODE और वह है एक और कॉलम बनाना जिसे आप CONCAT('user_id_',user_id) या कुछ इसी तरह के साथ पॉप्युलेट करेंगे, और फिर 2-कॉलम फुलटेक्स्ट इंडेक्स घोषित करेंगे।

filter_string VARCHAR(48) # populated with CONCAT('user_id_',user_id);
....
FULLTEXT KEY (message,filter_string)

फिर क्वेरी में सब कुछ निर्दिष्ट करें।

SELECT ...
 WHERE user_id = 500 AND
 MATCH (message,filter_string) AGAINST ('+kittens +puppies +user_id_500' IN BOOLEAN MODE);

अब, फुलटेक्स्ट इंडेक्स केवल उन पंक्तियों के मिलान के लिए जिम्मेदार होगा जहां बिल्ली के बच्चे, पिल्ले, और "user_id_500" दो कॉलम के संयुक्त पूर्ण टेक्स्ट इंडेक्स में दिखाई देते हैं, लेकिन आप अभी भी यह सुनिश्चित करने के लिए वहां पूर्णांक फ़िल्टर भी रखना चाहेंगे। संदेश में "user_id_500" की किसी भी यादृच्छिक उपस्थिति के बावजूद अंतिम परिणाम बाधित हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैसकल में ऐरे कहाँ पसंद है?

  2. MySQL परिणाम को बैश में संसाधित करना

  3. MySQL में VARCHAR और TEXT के बीच अंतर

  4. MySQL में संग्रहीत md5 स्ट्रिंग को दशमलव मान में बदलें

  5. एक यूपीएसईआरटी कैसे करें ताकि मैं अद्यतन भाग में नए और पुराने दोनों मूल्यों का उपयोग कर सकूं