Skip to content

SQL इंडेक्सिंग समझाई गई

SQL इंडेक्स प्रकारों, डिज़ाइन पैटर्न और रखरखाव पर एक चीटशीट।

इंडेक्स स्टोरेज और लिखने की गति की कीमत पर पढ़ने की गति देते हैं। सही संरचना चुनें, पंक्तियों का दायरा तय करें, और ब्लोट पर नियंत्रण रखें।

संदर्भ तालिका · 31 प्रविष्टियाँ
31 of 31 rows
इंडेक्स प्रकार
समानता, रेंज और क्रमबद्ध स्कैन के लिए संतुलित ट्री. ज़्यादातर डेटाबेस में डिफ़ॉल्ट.=, <, >, BETWEEN, ORDER BY के लिए उपयोग करें. फ़ुल-टेक्स्ट सर्च के लिए नहीं.
इंडेक्स जिसका लीफ़ स्तर ख़ुद टेबल है. पंक्तियाँ की-क्रम में संग्रहीत होती हैं. प्रति टेबल एक.InnoDB प्राइमरी की पर क्लस्टर होता है. इसके बिना SQL Server की टेबल heaps होती हैं.
अलग संरचना जिसमें कीज़ और बेस टेबल की ओर संकेतक होता है. प्रति टेबल कई.heap पर यह row ID रखता है. क्लस्टर्ड टेबल पर यह क्लस्टरिंग की रखता है.
केवल समानता लुकअप के लिए हैश टेबल. स्थिर समय में सटीक मिलान.केवल = ऑपरेशन के लिए; रेंज और क्रम के लिए B-tree चाहिए. SQL Server के memory-optimized हैश को पंक्ति-संख्या के निकट bucket count चाहिए.
Generalized Inverted Index. वैल्यूज़ को पंक्तियों से मैप करता है. ऐरे और फ़ुल-टेक्स्ट के लिए बना.jsonb, ऐरे, tsvector, trigram सर्च के लिए उपयोग करें. B-tree से धीमा बनता है.
Generalized Search Tree. नॉन-स्केलर प्रकारों और ओवरलैप क्वेरीज़ के लिए विस्तार योग्य.ज्यामितीय रेंज, kNN, exclusion कंस्ट्रेंट के लिए उपयोग करें. pg_trgm LIKE को तेज़ करता है.
स्पेस-पार्टीशंड GiST. radix या quad ट्री से डेटा को गैर-ओवरलैपिंग क्षेत्रों में बाँटता है.पॉइंट, IP प्रीफ़िक्स और प्रीफ़िक्स मिलान के लिए. ओवरलैप क्वेरी के लिए नहीं; GiST लें.
Block Range Index. प्रति ब्लॉक-रेंज min/max रखता है. बहुत छोटा फ़ुटप्रिंट.बड़ी, भौतिक रूप से क्रमबद्ध टेबल पर उपयोग करें. बनाना सस्ता, सिलेक्टिविटी कमज़ोर.
पंक्तियों की जगह कॉलम सेगमेंट के रूप में संग्रहीत इंडेक्स. उच्च कंप्रेशन, बैच निष्पादन.कई पंक्तियों और कुछ कॉलम पर विश्लेषणात्मक स्कैन के लिए. सिंगल-रो लुकअप धीमे होते हैं.
MySQL और SQL Server में समर्पित इनवर्टेड शब्द-इंडेक्स. प्रति टेक्स्ट कॉलम बनता है.MATCH AGAINST या CONTAINS उपयोग करें. Postgres फ़ुल-टेक्स्ट इसके बजाय tsvector पर GIN उपयोग करता है.
Oracle इंडेक्स जो प्रत्येक अद्वितीय वैल्यू के लिए एक bitmap रखता है. हर बिट एक पंक्ति दर्शाता है.रीड-हेवी वेयरहाउस में कम-कार्डिनैलिटी कॉलम पर उपयोग करें. समवर्ती राइट प्रति bitmap क्रमबद्ध होते हैं.
DESC घोषित इंडेक्स कॉलम. उस कॉलम की कीज़ उल्टे क्रम में संग्रहीत होती हैं.(a ASC, b DESC) जैसे मिश्रित सॉर्ट के लिए ज़रूरी. सादे DESC सॉर्ट सामान्य इंडेक्स को उल्टा भी पढ़ सकते हैं.
MySQL 8 इंडेक्स जिसे ऑप्टिमाइज़र नज़रअंदाज़ करता है. फिर भी हर राइट पर बना रहता है.असर जाँचने के लिए ड्रॉप से पहले इंडेक्स छिपाएँ. रीबिल्ड के बिना दोबारा दिखाएँ.
डिज़ाइन
बहु-कॉलम इंडेक्स. अग्रस्थ कॉलम क्वेरी फ़िल्टर के क्रम से मेल खाने चाहिए.पहले समानता, फिर रेंज क्रम में रखें. दो सिंगल इंडेक्स एक कंपोज़िट का विकल्प नहीं हैं.
WHERE प्रेडिकेट पर इंडेक्स. SQL Server इसे filtered index कहता है. केवल मेल खाती पंक्तियाँ कवर करता है.केवल active='t' पंक्तियाँ इंडेक्स करें. आकार और राइट लागत आधी हो जाती है.
अतिरिक्त नॉन-की कॉलम जोड़ा हुआ B-tree. इंडेक्स-ओनली स्कैन heap लुकअप से बचते हैं.बार-बार ली जाने वाली कॉलम INCLUDE से जोड़ें. इंडेक्स सॉर्ट करने योग्य बना रहता है.
इंडेक्स जो डुप्लिकेट वैल्यू प्रतिबंधित करता है. टकराते insert अस्वीकार करता है.नैचुरल की और वन-टू-वन कंस्ट्रेंट के लिए. UNIQUE NULL कई NULL की अनुमति देता है.
कॉलम के बजाय कॉलम के फ़ंक्शन पर बना इंडेक्स.lower(email) या date_trunc('day', created_at) इंडेक्स करें. क्वेरी को ठीक वही एक्सप्रेशन दोहराना होगा.
ऑपरेटर क्लास. परिभाषित करती है कि इंडेक्स किसी कॉलम के प्रकार की तुलना और संग्रह कैसे करे.LIKE 'abc%' के लिए बिना केस-फ़ोल्डिंग varchar_pattern_ops सेट करें. डिफ़ॉल्ट समानता और रेंज के लिए ठीक हैं.
प्लान जो क्वेरी का उत्तर केवल इंडेक्स पेजों से देता है. heap कभी नहीं पढ़ा जाता.हर ली गई कॉलम इंडेक्स या INCLUDE सूची में होनी चाहिए. Vacuum विज़िबिलिटी मैप अपडेट रखता है.
फ़ॉरेन की कॉलम को रेफ़रेंस करने वाली टेबल पर कोई स्वचालित इंडेक्स नहीं मिलता.जिस FK कॉलम से join या delete करते हैं उसे इंडेक्स करें. इसके बिना cascade delete चाइल्ड टेबल स्कैन करता है.
रखरखाव
प्लान निरीक्षक. सिक्वेंशियल स्कैन, इंडेक्स चयन, लागत अनुमान दिखाता है.EXPLAIN (ANALYZE, BUFFERS) उपयोग करें. 10M पंक्ति वाली टेबल पर Seq Scan का मतलब है गायब इंडेक्स.
प्लानर सांख्यिकी बनाने के लिए टेबल कॉलम के सैंपल लेता है. हिस्टोग्राम इंडेक्स चयन तय करते हैं.बल्क लोड के बाद चलाएँ. पुरानी सांख्यिकी इंडेक्स्ड कॉलम पर seq scan करवाती है.
हर इंडेक्स राइट ओवरहेड बढ़ाता है. insert, update, delete प्रति इंडेक्स भुगतान करते हैं.अप्रयुक्त इंडेक्स हटाएँ. pg_stat_user_indexes में उपयोग देखें.
प्रति-इंडेक्स उपयोग का Postgres व्यू. सांख्यिकी रीसेट के बाद से स्कैन और पढ़े गए tuple गिनता है.अप्रयुक्त इंडेक्स खोजने के लिए idx_scan = 0 फ़िल्टर करें. काउंटर pg_stat_reset() से रीसेट करें.
पढ़ने या लिखने को रोके बिना इंडेक्स बनाता है. दो टेबल स्कैन चाहिए.ट्रांज़ैक्शन के अंदर नहीं चल सकता. विफल बिल्ड हटाने के लिए एक INVALID इंडेक्स छोड़ देता है.
इंडेक्स हटाकर उसका स्टोरेज खाली करता है. डिफ़ॉल्ट रूप से एक्सक्लूसिव लॉक लेता है.व्यस्त टेबल पर DROP INDEX CONCURRENTLY उपयोग करें. हटाने से पहले उपयोग सांख्यिकी देखें.
ब्लोटेड इंडेक्स रीबिल्ड करता है. मृत tuple से जगह वापिस लेता है.प्रोडक्शन में REINDEX CONCURRENTLY उपयोग करें. इसके बिना लॉक राइट रोकते हैं.
मृत tuple और पेज गैप जो MVCC टेबल और उनके इंडेक्स में जमा होते हैं.pgstattuple से मापें. बार-बार Vacuum करें; जब मृत स्थान हावी हो तो REINDEX.
लिखते समय पेज भरने का प्रतिशत. खाली जगह भविष्य के अपडेट सोख लेती है.हॉट-अपडेट टेबल पर इसे 70-90 करें. भरे पेज page split को मजबूर करते हैं.
टेबल को इंडेक्स के क्रम में भौतिक रूप से फिर लिखता है. एक बार का ऑपरेशन.क्रमबद्ध ब्लॉक के लिए BRIN के साथ जोड़ी बनाता है. आगे की राइट पर क्रम बना नहीं रहता.