मुख्य सामग्री पर जाएं
मॉड्यूल 10 · पाठ 3 का 4पाठ्यक्रम में 39/57~12 min
मॉड्यूल पाठ (3/4)

समग्र और आंशिक सूचकांक

पिछले पाठों में हमने रैखिक DBMS क्वेरीज़ (WHERE country = 'Italy') के लिए इंडेक्स का उपयोग करना शामिल किया था। जब हम दो संयुक्त मोर्चों पर खोज करते हैं तो क्या होता है?

उदाहरण के लिए, एक वास्तविक ई-कॉमर्स में हम ऐसे ऑर्डर ढूंढना चाहेंगे जो एक विशिष्ट ग्राहक आईडी से संबंधित हों और एक निश्चित समय सीमा के भीतर आते हों: WHERE customer_id = 90 AND placed_at >= '2025-01-01'.

यदि आपके पास केवल customer_id पर बेस इंडेक्स है, तो पोस्टग्रेज बाइनरी ट्री का उपयोग करके कुछ ही समय में ग्राहक के 50 ऑर्डर ढूंढ लेगा, लेकिन फिर उसे मैन्युअल रूप से और क्रमिक रूप से उनमें से सभी 50 के माध्यम से पुनरावृत्त करना होगा, आंखों से तारीखों को फ़िल्टर करना होगा।

समग्र सूचकांक

हम डीबीएमएस को "विश्लेषणात्मक शब्दकोश" फ़ाइलों को एक प्रमुख आयाम के साथ नहीं, बल्कि कई आयामों के साथ ऑर्डर करने के लिए कह सकते हैं।

SQL
CREATE INDEX idx_orders_customer_date ON orders(customer_id, placed_at);

एक "मिश्रित" सूचकांक अपने मापदंडों के क्रम को बहुत महत्वपूर्ण मानता है: यहां बी-ट्री नोड्स समूह और एक ब्लॉक में customer_id को कठोरता से वर्गीकृत करते हैं (पृथक्करण के लिए सबसे भेदभावपूर्ण); उनके अंदर एक उप-वृक्ष रहता है जो विभिन्न placed_at समय मानों के साथ पूर्णतया क्रमबद्ध क्रम में शाखाबद्ध होता है।

यह संरचना अनेक नेस्टेड विधेय वाले WHERE उपवाक्यों को बेरहमी से नष्ट कर देती है।

आंशिक सूचकांक (फ़िल्टर किए गए सूचकांक)

प्रत्येक सूचकांक उपयोगकर्ता-इनपुट स्ट्रीम पर डिस्क स्थान और सीपीयू खर्च करता है। क्या होगा यदि ई-कॉमर्स को लगातार फ़िल्टर को सॉर्ट करने और पुनर्प्राप्त करने की आवश्यकता होती है, लेकिन केवल अल्पसंख्यक रिकॉर्ड के लिए? (उदाहरण के लिए: अपठित-अधिसूचना जांच को तेजी से मतदान करना।) सभी 10,000,000 सूचनाओं पर "is_read" सूचकांक बनाना अविश्वसनीय रूप से कठिन है यदि "अपठित" उनमें से केवल 5 का प्रतिनिधित्व करता है।

SQL
CREATE INDEX idx_unread_notifs ON notifications(user_id)
  WHERE is_read = false; -- Questa aggiuntiva è l'"Indice Parziale"

डेटाबेस एक बिजली-तेज बी-ट्री बनाएगा जो डीबी तक त्वरित पहुंच कुंजी संग्रहीत करता है केवल यदि रिकॉर्ड अपठित है! डिस्क को 10 मिलियन वाली एक के बजाय 5 पंक्तियों (3 बाइट्स) की अनुक्रमणिका से प्यार हो जाएगा। तेज़ चयन से पूरा लाभ मिलता है:

SELECT * FROM notifications WHERE user_id = 2 AND is_read = false;

आपकी बारी

व्यायाम#sql.m10.l3.e1
प्रयास: 0लोड हो रहा है...

हम अस्थायी पासवर्ड/रीसेट टोकन के लुकअप को अनुकूलित करना चाहते हैं। हम किसी ज्ञात शहर के साथ संयुक्त रूप से किसी विशिष्ट देश से साइन अप किए गए सभी ग्राहकों की तलाश में अक्सर SELECT कॉल करते हैं।\n'ग्राहकों' पर 'idx_cust_loc' नामक एक समग्र सूचकांक बनाएं। पहले 'देश' फ़ील्ड (जो अधिक विशिष्ट है) और फिर 'शहर' फ़ील्ड पास करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

सिंटैक्स: टेबल पर इंडेक्स नाम बनाएं (col1, col2);

3 प्रयासों के बाद समाधान उपलब्ध है

सशर्त (आंशिक) सूचकांकों की खोज

व्यायाम#sql.m10.l3.e2
प्रयास: 0लोड हो रहा है...

शॉपिंग उपयोगकर्ता लुकअप को अनुकूलित करें: उपयोगकर्ता पूर्व-पंजीकरण करते हैं लेकिन हमें केवल उन्हें उनके कालानुक्रमिक साइनअप क्रम में सूचीबद्ध करने की आवश्यकता है ('ग्राहकों' में 'signed_up_on' पर एक इंडेक्स बनाएं) लेकिन केवल सटीक पूर्ण-स्ट्रिंग 'शहर': 'मिलानो' के ग्राहकों तक ही सीमित है।

संपादक लोड हो रहा है...
संकेत दिखाएँ

यह सामान्यतः लक्ष्य संपत्ति पर घोषित किया जाता है; अंत में आप जादुई कीवर्ड WHERE शहर = 'मिलानो' जोड़ें।

3 प्रयासों के बाद समाधान उपलब्ध है