आपकी पहली क्वेरी में, ORDER BY views_point
. का उपयोग करके किया जाता है INDEX, क्योंकि इसका उपयोग क्वेरी के WHERE भाग में किया गया था और इसलिए MySQL में छँटाई के लिए उपयोग किया जा सकता है।
दूसरी क्वेरी में, MySQL एक भिन्न अनुक्रमणिका, listing_pcs
का उपयोग करके WHERE भाग को हल करता है . इसका उपयोग ORDER BY शर्त को पूरा करने के लिए नहीं किया जा सकता है। MySQL इसके बजाय फाइलसॉर्ट का उपयोग करता है, जो सबसे अच्छा विकल्प है यदि किसी इंडेक्स का उपयोग नहीं किया जा सकता है।
MySQL केवल अनुक्रमणिका का उपयोग क्रमबद्ध करने के लिए करता है यदि अनुक्रमणिका वही है जो WHERE स्थिति में उपयोग की जाती है। यह है मैनुअल इसका मतलब है:
तो आप क्या कर सकते हैं:
-
अपना
sort_buffer_size
increasing बढ़ाने का प्रयास करें फाइलसॉर्टिंग को यथासंभव प्रभावी बनाने के लिए कॉन्फिग विकल्प। बड़े परिणाम जो सॉर्ट बफर के लिए बहुत बड़े होते हैं, MySQL को सॉर्ट को टुकड़ों में तोड़ देता है, जो धीमा है। -
MySQL को एक अलग इंडेक्स चुनने के लिए बाध्य करें। यह ध्यान देने योग्य है कि अलग-अलग MySQL संस्करण अलग-अलग डिफ़ॉल्ट इंडेक्स चुनते हैं। उदाहरण के लिए, संस्करण 5.1 काफी खराब है क्योंकि इस रिलीज के लिए क्वेरी ऑप्टिमाइज़र को काफी हद तक फिर से लिखा गया था और इसमें बहुत सारे शोधन की आवश्यकता थी। संस्करण 5.6 बहुत अच्छा है।
SELECT * FROM listings FORCE INDEX (views_point) WHERE (`publishedon_hourly` BETWEEN UNIX_TIMESTAMP( '2015-09-5 00:00:00' ) AND UNIX_TIMESTAMP( '2015-09-5 12:00:00' )) AND (published =1) AND cat_id IN ( 1, 2, 3, 4, 5 ) ORDER BY `views_point` DESC LIMIT 10