यह प्रश्न:
SELECT *
FROM listings
WHERE (publishedon BETWEEN 1441105258 AND 1443614458) AND
(published = 1) AND
(cat_id in (1,2,3,4,5)) AND
(source_id in (1,2,3,4,5));
केवल अनुक्रमणिका के साथ अनुकूलित करना कठिन है। सबसे अच्छी अनुक्रमणिका वह है जो published
. से शुरू होती है और उसके बाद अन्य कॉलम हैं -- यह स्पष्ट नहीं है कि उनका क्रम क्या होना चाहिए। इसका कारण यह है कि published
को छोड़कर सभी =
का उपयोग नहीं कर रहे हैं ।
चूंकि आपकी प्रदर्शन समस्या एक प्रकार की है, जो बताती है कि बहुत सारी पंक्तियां वापस की जा रही हैं। आमतौर पर, एक इंडेक्स का उपयोग WHERE
. को संतुष्ट करने के लिए किया जाता है इंडेक्स से पहले क्लॉज ORDER BY
. के लिए इस्तेमाल किया जा सकता है . इससे इसे अनुकूलित करना कठिन हो जाता है।
सुझाव। . . कोई भी महान नहीं है:
- यदि आप महीने के हिसाब से डेटा एक्सेस करने जा रहे हैं, तो आप महीने के हिसाब से डेटा को विभाजित करने पर विचार कर सकते हैं। यह
ORDER BY
. के बिना क्वेरी बना देगा तेज़, लेकिनORDER BY
. में सहायता नहीं करेगा । published
के बाद कॉलम के विभिन्न क्रमों को आजमाएं सूचकांक में। आपको सबसे चुनिंदा कॉलम मिल सकते हैं। लेकिन, एक बार फिर, यह छँटाई से पहले क्वेरी को गति देता है।- उन तरीकों के बारे में सोचें जिनसे आप
WHERE
में अधिक समानता की स्थिति के लिए क्वेरी की संरचना कर सकते हैं खंड या डेटा का एक छोटा सेट वापस करने के लिए। - (वास्तव में अनुशंसित नहीं)
published
पर एक अनुक्रमणिका लगाएं और ऑर्डरिंग कॉलम। फिर डेटा लाने के लिए एक सबक्वायरी का उपयोग करें। असमानता की शर्तें रखें (IN
और इसी तरह) बाहरी क्वेरी में। सबक्वेरी अनुक्रमण के लिए छँटाई के लिए उपयोग करेगी और फिर परिणामों को फ़िल्टर करेगी।
अंतिम अनुशंसित नहीं होने का कारण यह है कि SQL (और MySQL) एक सबक्वेरी से परिणामों के क्रम की गारंटी नहीं देता है। हालाँकि, क्योंकि MySQL उपश्रेणियों को अमल में लाता है, परिणाम वास्तव में क्रम में हैं। मुझे अनिर्दिष्ट दुष्प्रभावों का उपयोग करना पसंद नहीं है, जो एक संस्करण से दूसरे संस्करण में बदल सकते हैं।