2010-02-19 16 views
7

लेते हैं हाल ही में मुझे MySQL को विशिष्ट प्रश्नों पर लटका दिया जा रहा है। मेरे पास 500,000+ रिकॉर्ड के साथ एक टेबल है।MySQL सॉर्टिंग परिणाम लंबे समय तक

चुनें * items से जहां (itemlist_id = 115,626) द्वारा tableOrder DESC LIMIT में 1

यहाँ आदेश की व्याख्या: क्वेरी किया जा रहा रन है

| 1 | सरल | आइटम | सभी | नल | नल | नल | नल | 587113 | कहां उपयोग करना; Filesort का उपयोग करना |

और यहाँ process_list प्रविष्टि है:

| 2529 9 6 | जड़ | लोकलहोस्ट | itemdb | प्रश्न | 0 | सॉर्टिंग परिणाम | चुनें * items से जहां (itemlist_id = 115642) तालिका ऑर्डर डीईएससी लिमिटेड द्वारा आदेश 1 |

कोई विचार क्या इस क्वेरी को संसाधित करने में 10 मिनट लग सकता है? जब मैं इसे मैन्युअल रूप से चलाता हूं तो यह जल्दी से किया जाता है। (सेट में 1 पंक्ति (0.86 सेकंड))

धन्यवाद

+1

क्या आप वाकई सॉर्टिंग धीमा है, और रिकॉर्ड नहीं ढूंढ रहे हैं? यदि आपके पास उस फ़ील्ड पर 500k + रिकॉर्ड्स का टेबल स्कैन है जो अनुक्रमित नहीं है तो इसमें कुछ समय लग सकता है। और "मैनुअल" तीव्रता हो सकती है क्योंकि MySQL (या ओएस) ने पहले के प्रयास से डेटा में कैश किया है और यह बहुत तेज़ चलता है। –

उत्तर

6

आप क्वेरी एक छोटे से items (itemList_id, TableOrder) पर एक सूचकांक बना सकते हैं और फिर से लिखने की जरूरत है:

SELECT * 
FROM items 
WHERE itemlist_id = 115626 
ORDER BY 
     itemlist_id DESC, tableOrder DESC 
LIMIT 1 

ORDER BY में पहली शर्त लग सकता है अनावश्यक है, लेकिन यह सही योजना (जो क्रमबद्ध नहीं है) चुनने के लिए MySQL में मदद करता है।

+0

धन्यवाद! मैंने इंडेक्स और क्वेरी को जोड़ा, और अब यह तेजी से चमक रहा है। –

+0

क्या आप कृपया क्वेरी में किए गए संपादन के लिए संसाधन दे सकते हैं। यह समझना बहुत महत्वपूर्ण है कि मेरे लिए क्यों। – TDSii

+1

@TDSii: मैंने 'MySQL' दस्तावेज़ों और मेरे अनुभव के आधार पर संपादन किया है। – Quassnoi

संबंधित मुद्दे