LIKE कैसे लागू किया जाता है?


22

क्या कोई बता सकता है कि मौजूदा डेटाबेस सिस्टम (जैसे MySQL या Postgres) में LIKE ऑपरेटर कैसे लागू किया जाता है? या मुझे कुछ संदर्भों की ओर इंगित करें जो इसे समझाते हैं?

भोली दृष्टिकोण प्रत्येक रिकॉर्ड का निरीक्षण करने के लिए होगा, ब्याज के क्षेत्र पर एक नियमित अभिव्यक्ति या आंशिक स्ट्रिंग मैच को निष्पादित करेगा, लेकिन मुझे यह महसूस (आशा) है कि ये प्रणालियां कुछ ज्यादा ही चालाक हैं।

जवाबों:


19

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

SELECT *
  FROM employees
 WHERE last_name LIKE 'Cav%'

डेटाबेस उन LAST_NAMEसभी पंक्तियों को खोजने के लिए सूचकांक का उपयोग कर सकता है जहां अंतिम नाम 'कैव' शुरू होता है। दूसरी ओर, अगर आपके पास कुछ ऐसा था

SELECT *
  FROM employees
 WHERE last_name LIKE '%av%'

डेटाबेस को संपूर्ण तालिका (या संपूर्ण सूचकांक) को स्कैन करना होगा और पूर्ण LAST_NAMEमूल्य के खिलाफ अभिव्यक्ति का मूल्यांकन करना होगा । जाहिर है, यह बहुत महंगा है।

अधिकांश बेहतर संबंधपरक डेटाबेस में विभिन्न प्रकार के अनुक्रमित और पाठ कैटलॉग का निर्माण करके पूर्ण-पाठ खोज को अधिक कुशल तरीके से करने की सुविधा है, लेकिन ये LIKE कीवर्ड का उपयोग नहीं करते हैं। उदाहरण के लिए, यहाँ एक अच्छा लेख है जो PostgreSQL में पूर्ण-पाठ खोज पर चर्चा करता है ।


4
Oracle एक प्रमुख प्रतिशत के साथ भी एक सूचकांक का उपयोग कर सकता है। यदि खोजा जा रहा डेटा पंक्तियों के एक छोटे से उपसमूह का प्रतिनिधित्व करता है तो संकेत इसे सूचकांक का उपयोग करने और निष्पादन को तेज करने के लिए मजबूर कर सकता है। Laurentschneider.com/wordpress/2009/07/… देखें ।
लेह रिफ़ेल

1
"संपूर्ण तालिका को स्कैन करें ... स्पष्ट रूप से, यह बहुत महंगा है" - जो कि तालिका पर निर्भर करता है?) ps क्या आप सहमत LAST_NAMEसूचकांक के लिए एक उम्मीदवार (पहला स्तंभ) हैं? pps किस हद तक यह मानता है कि डेटाबेस सिस्टम डिस्क और बी-ट्री इंडेक्स पर सन्निहित भंडारण पर आधारित है?

26

जस्टिन केव ने जो लिखा उसके अलावा, पोस्टग्रेसीक्यू 9.1 के बाद आप किसी भी खोज को LIKE( ~~) या ILIKE( ~~*), और बेसिक रेगुलर एक्सप्रेशन मैच, ( ) के साथ गति दे सकते हैं ~। मॉड्यूल pg_trgm द्वारा प्रदान किए गए ऑपरेटर वर्गों का उपयोग GIN या GiST इंडेक्स के साथ उन LIKEअभिव्यक्तियों को गति देने के लिए करें जो बाएं-एंकर नहीं हैं। एक्सटेंशन इंस्टॉल करने के लिए, प्रति डेटाबेस एक बार चलाएं:

CREATE EXTENSION pg_trgm;

फॉर्म का एक इंडेक्स बनाएं

CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);

या:

CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);

GIN या GiST इंडेक्स को बनाना और बनाए रखना एक लागत वहन करता है, लेकिन यदि आपकी तालिका में भारी मात्रा में नहीं लिखा गया है, तो यह आपके लिए एक बड़ी विशेषता है।

डीपेज़ ने अपने ब्लॉग में नई सुविधा के बारे में एक उत्कृष्ट लेख लिखा है ।

GIN या GiST?

मैनुअल से ये दो उद्धरण कुछ मार्गदर्शन प्रदान करना चाहिए

GiST और GIN इंडेक्सिंग के बीच का चुनाव GiST और GIN के सापेक्ष प्रदर्शन विशेषताओं पर निर्भर करता है, जिनकी चर्चा कहीं और की जाती है। अंगूठे के नियम के रूप में, GIN सूचकांक GiST सूचकांक की तुलना में तेजी से खोजा जाता है, लेकिन निर्माण या अद्यतन करने के लिए धीमा होता है; इसलिए GIN स्थैतिक डेटा और अक्सर अद्यतन किए गए डेटा के लिए GiST के लिए बेहतर अनुकूल है।

लेकिन दूरी ऑपरेटर के उपयोग के साथ "निकटतम पड़ोसी" प्रकार के प्रश्नों के लिए <->:

इसे GiST इंडेक्स द्वारा काफी कुशलता से लागू किया जा सकता है, लेकिन GIN इंडेक्स द्वारा नहीं।


3
यह पढ़कर मुझे आश्चर्य हुआ कि क्या GIN या GiST का उपयोग करना है। मैंने जो पढ़ा है, उसके अनुसार जीआईएन इंडेक्स बनाए रखने के लिए अधिक महंगे हैं लेकिन तेजी से खोज करते हैं, जबकि एक जीएसटी इंडेक्स बनाए रखने के लिए सस्ता है लेकिन खोज करने के लिए धीमा है। इसका मतलब यह है कि GIN इंडेक्स को आमतौर पर अपेक्षाकृत स्थिर डेटा पर उपयोग किया जाना चाहिए, जबकि GiST इंडेक्स को अधिक भारी परिवर्तनशील तालिकाओं पर पसंद किया जाता है।
कॉलिन के हार्ट हार्ट

1
@ Colin'tHart: यह आमतौर पर सच है, लेकिन नियम के अपवाद हैं। ऊपर के परिशिष्ट पर विचार करें।
इरविन ब्रांडस्टेट्टर

5

MySQL के बारे में बात करते हुए, वाइल्ड-कार्ड कैरेक्टर (%) की स्थिति पर फर्क पड़ता है। यदि पाठ का पहला भाग जैसे निर्दिष्ट किया गया है where first_name like 'Sta%', तो DB इंजन S के साथ घूरने वाले शब्दों का केवल एक छोटा सा उप-भाग खोजेगा, फिर St और फिर Sta, आदि पर जा सकता है। यदि आप कुछ ऐसा करते हैं where first_name like '%stan%', तो और संपूर्ण स्कैन कॉलम की आवश्यकता होगी। आप पूर्ण-पाठ इंडेक्स में भी देख सकते हैं जो प्राकृतिक भाषा खोज भी करता है। यहां MySQL डॉक्स देखें।


1
जब सबस्ट्रिंग को 3 वर्णों में परिभाषित किया जाता है, तो यह "S%" क्यों खोजना शुरू कर देगा (अर्थात हम जानते हैं कि स्ट्रिंग "Sr%" नहीं है)? या आप मान रहे थे कि डीबी में विशेषताओं के ऊपर एक उपसर्ग वृक्ष है और इस पेड़ का पता लगाने का एक उदाहरण प्रदान करता है?
निक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.