id
. द्वारा आदेश देना datetime
. द्वारा ऑर्डर करते समय शायद क्लस्टर्ड इंडेक्स स्कैन का उपयोग करता है सॉर्टिंग या इंडेक्स लुकअप का उपयोग करता है।
क्लस्टर इंडेक्स स्कैन की तुलना में ये दोनों विधियां अधिक धीमी हैं।
यदि आपकी तालिका id
. द्वारा संकुलित है , मूल रूप से इसका मतलब है कि यह पहले से ही सॉर्ट किया गया है। रिकॉर्ड एक B+Tree
. में समाहित हैं जिसमें id
. में पृष्ठों को जोड़ने वाली एक लिंक की गई सूची है गण। id
. द्वारा रिकॉर्ड किए गए रिकॉर्ड प्राप्त करने के लिए इंजन को केवल लिंक की गई सूची को पार करना चाहिए ।
अगर id
अनुक्रमिक क्रम में s सम्मिलित किए गए थे, इसका अर्थ है कि पंक्तियों का भौतिक क्रम तार्किक क्रम से मेल खाएगा और संकुल अनुक्रमणिका स्कैन और भी तेज़ होगा।
यदि आप चाहते हैं कि आपके रिकॉर्ड datetime
. द्वारा ऑर्डर किए जाएं , दो विकल्प हैं:
- तालिका से सभी रिकॉर्ड लें और उन्हें क्रमबद्ध करें। धीमापन स्पष्ट है।
- इंडेक्स का उपयोग
datetime
पर करें . इंडेक्स को डिस्क के एक अलग स्थान में संग्रहीत किया जाता है, इसका मतलब है कि इंजन को नेस्टेड लूप में इंडेक्स पेज और टेबल पेज के बीच शटल की जरूरत होती है। यह और भी धीमा है।
ऑर्डरिंग को बेहतर बनाने के लिए, आप datetime
. पर एक अलग कवरिंग इंडेक्स बना सकते हैं :
CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)
, और अपनी क्वेरी में आपके द्वारा उपयोग किए जाने वाले सभी स्तंभों को उस अनुक्रमणिका में शामिल करें।
यह इंडेक्स आपकी टेबल की शैडो कॉपी की तरह है लेकिन डेटा को अलग-अलग क्रम में सॉर्ट किया गया है।
यह कुंजी लुकअप से छुटकारा पाने की अनुमति देगा (चूंकि अनुक्रमणिका में सभी डेटा शामिल हैं) जो datetime
द्वारा आदेश देगा id
. पर जितनी जल्दी हो सके ।
अपडेट करें:
इस समस्या पर एक ताज़ा ब्लॉग पोस्ट: