PostgreSQL में कई प्रकार के इंडेक्स हैं:बी-ट्री, हैश, जीआईएसटी, जिन और एसपी-जीआईएसटी। जाहिर है उनमें से प्रत्येक एक विशिष्ट आवश्यकता को कवर करता है। उदाहरण के लिए, PostgreSQL प्रलेखन GIN अनुक्रमणिका के बारे में कहता है:
इसलिए GIN इंडेक्स का उपयोग किसी ऐरे, एक hstore आदि के तत्वों को इंडेक्स करने के लिए किया जा सकता है।
लेकिन इस बार हम उन कॉन्ट्रिब मॉड्यूल में से एक के बारे में बात करेंगे जो अधिक प्रकार के ऑपरेटर प्रदान करते हैं जिनका उपयोग GIN इंडेक्स के साथ किया जा सकता है:pg_trgm।
यह मॉड्यूल टेक्स्ट स्ट्रिंग्स के ट्रिगर बनाता है ताकि इसका उपयोग समानताएं खोजने के लिए किया जा सके। यह GIN जैसी अनुक्रमणिका को अनुमति देता है जो gin_trgm_ops ऑपरेटर वर्ग का उपयोग LIKE खोजों में उपयोग करने के लिए करती है, तब भी जब खोज पैटर्न की शुरुआत में '%' वाइल्डकार्ड पाया जाता है (उदाहरण के लिए:LIKE नाम '% jaime%')।
एक इंडेक्स बनाने के लिए जिसे इस तरह इस्तेमाल किया जा सकता है, इंडेक्स को इस तरह बनाया जाना चाहिए:
CREATE INDEX idx_gin ON table USING GIN (campo_texto gin_trgm_ops);
इस तरह की एक अनुक्रमणिका के साथ मैंने देखा है कि प्रश्न 10 से अधिक से कुछ मिलीसेकंड तक गिरते हैं; हालांकि, इससे पहले कि आप इन अनुक्रमणिकाओं को बनाने में जल्दबाजी करें, आइए आपकी समस्याओं पर विचार करें।
निम्नलिखित क्वेरी पर विचार करें "show_trgm ('जैमे कैसानोवा') का चयन करें);" यह हमें एक टेक्स्ट स्ट्रिंग के ट्रिग्राम दिखाता है, इस मामले में 15 ट्रिगर। इसलिए यह कल्पना करना मुश्किल नहीं है कि इस प्रकार का सूचकांक बहुत बढ़ता है, और टेक्स्ट स्ट्रिंग जितना बड़ा होता है, उतना ही अधिक सूचकांक बढ़ता है (क्योंकि अधिक ट्रिगर होंगे)। एक और स्पष्ट निष्कर्ष यह है कि इस प्रकार के इंडेक्स को बनाए रखना महंगा हो सकता है, वास्तव में वे INSERT और UPDATE के प्रदर्शन को बहुत प्रभावित कर सकते हैं, खासकर अगर एक ही टेबल पर इनमें से कई इंडेक्स हैं, तो इस समस्या को थोड़ा कम करने के लिए फास्टअपडेट नामक तकनीक का आविष्कार किया गया था जिसमें लंबित की एक अनियंत्रित सूची को बनाए रखना शामिल है। तो INSERT और UPDATE मुख्य इंडेक्स में डालने के बजाय, वे इस अतिरिक्त संरचना में ऐसा तब तक करते हैं जब तक VACUUM नहीं होता है या जब तक लंबित सूची work_mem से बड़ी नहीं हो जाती है। कमियां हैं:1) इंडेक्स को पढ़ने के लिए इस अतिरिक्त संरचना को भी पढ़ना चाहिए, जो क्वेरी प्रदर्शन को प्रभावित कर सकता है; और 2) एक INSERT या UPDATE के कारण बैकलॉग बहुत बड़ा हो सकता है और इसलिए बैकलॉग को संसाधित करना शुरू कर देगा जो उस INSERT या UPDATE को प्रभावित करेगा और उस टेबल पर एक साथ होने वाले अन्य सभी ऑपरेशन।
निष्कर्ष के तौर पर; pg_trgm मॉड्यूल के साथ एक GIN इंडेक्स कुछ प्रश्नों के प्रदर्शन में बहुत मदद कर सकता है, हालांकि उनका दुरुपयोग नहीं किया जाना चाहिए क्योंकि वे दोधारी तलवार हो सकते हैं।