मुझे एक समाधान मिला जो तालिका में डेटा के गुणों पर निर्भर करता है। मेरे पास एक अधिक सामान्य समाधान होगा जो वर्तमान डेटा पर निर्भर नहीं है, लेकिन फिलहाल मेरे पास सबसे अच्छा है।
मूल क्वेरी के साथ समस्या:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
यह है कि निष्पादन के लिए FirstX
. में प्रविष्टियों के एक बड़े प्रतिशत को स्कैन करने की आवश्यकता हो सकती है ,LastX
,P
सूचकांक जब पहली शर्त FirstX <= ?
पंक्तियों के एक बड़े प्रतिशत से संतुष्ट हैं।
निष्पादन समय को कम करने के लिए मैंने जो किया वह यह है कि LastX-FirstX
अपेक्षाकृत छोटा है।
मैंने क्वेरी चलाई:
SELECT MAX(LastX-FirstX) FROM SomeTable;
और मिला 4200000
।
इसका मतलब है कि FirstX >= LastX – 4200000
तालिका में सभी पंक्तियों के लिए।
तो LastX >= ?
. को संतुष्ट करने के लिए , हमें FirstX >= ? – 4200000
।
इसलिए हम क्वेरी में एक शर्त इस प्रकार जोड़ सकते हैं:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
उदाहरण में मैंने प्रश्न में परीक्षण किया, संसाधित की गई अनुक्रमणिका प्रविष्टियों की संख्या 2104820
. से घटा दी गई थी करने के लिए 18
और चलने का समय 0.563 सेकंड . से कम कर दिया गया था करने के लिए 0.0003 सेकंड ।
मैंने उसी 120000
. के साथ नई क्वेरी का परीक्षण किया X
. के मान . आउटपुट पुरानी क्वेरी के समान था। समय कम हो गया 10 घंटे . से अधिक से 5.5 मिनट , जो 100 गुना तेज . से अधिक है ।