2012-04-11 30 views
20

मेरे पास एक सारणी है जिसमें से मुझे अवरोही क्रम में किसी फ़ील्ड द्वारा आदेशित पंक्तियां प्राप्त करने की आवश्यकता है। जब एक EXPLAIN क्वेरी निम्नलिखित की तरह चल रहा है:मैं MySQL में एक डीईएससी इंडेक्स कैसे बना सकता हूं?

EXPLAIN SELECT ... FROM table WHERE ... ORDER BY field DESC 

मैं Extra कॉलम में Using where; Using filesort मिलता है। तो मैं एक DESC सूचकांक बनाने की कोशिश:

CREATE INDEX name ON table (field DESC); 

लेकिन जब मैं EXPLAIN फिर से चलाने के लिए, मैं एक ही Using where; Using filesortExtra कॉलम में मिलता है और प्रदर्शन काफी एक ही है।

मैं क्या गलत कर रहा हूं?

उत्तर

43

कि उन MySQL "सुविधाओं" जहां यह चुपचाप कुछ करने के लिए आपके अनुरोध पर ध्यान नहीं देता में से एक है क्योंकि यह केवल लागू नहीं किया है:।

http://dev.mysql.com/doc/refman/5.5/en/create-index.html

" एक index_col_name विनिर्देश एएससी या DESC साथ समाप्त कर सकते हैं से इन कीवर्ड को आरोही या अवरोही सूचकांक मूल्य भंडारण निर्दिष्ट करने के लिए भविष्य के एक्सटेंशन के लिए अनुमति है। वर्तमान में, उन्हें पार्स किया गया है लेकिन अनदेखा किया गया है; इंडेक्स मान हमेशा आरोही क्रम में संग्रहीत होते हैं "

+2

और इसलिए "हैश" अनुक्रमणिका हैं। MySQL डेवलपर्स अपने "CREATE INDEX" कथन में सबकुछ क्यों दे रहे हैं लेकिन कुछ भी लागू नहीं कर रहे हैं? – akki

10

जैसा कि बताया गया है कि सुविधा लागू नहीं है nted लेकिन कुछ समाधान रुचि का हो सकता:

एक संभावना यह एक नकार या रिवर्स मूल्य में क्षेत्र स्टोर करने के लिए है।

यदि यह एक नंबर पर आप स्टोर कर सकते हैं (-n) या (MAXVAL -n) अगर है अहस्ताक्षरित

यदि यह एक तारीख या टाइमस्टैम्प है, कुछ (बजाय एक नंबर की दुकान है और इस तरह FROM_UNIXTIME रूप में उपयोग के कार्यों के लिए की वकालत करेंगे)

पाठ्यक्रम इस तरह के परिवर्तन हमेशा आसानी से नहीं किया जाता है के

... मौजूदा कोड आदि

1

MySQL संस्करण 8 से शुरू पर निर्भर करता है DESC अनुक्रमित समर्थन करता है। इससे पहले कि डीईएससी चुपचाप नजरअंदाज कर दिया गया था। यह (ए) सिंगल-कॉलम इंडेक्स या (बी) मल्टी-कॉलम इंडेक्स के लिए कोई समस्या नहीं थी, जहां सभी कॉलमों की एक दिशा थी: या तो सभी एएससी या सभी डीईएससी - चूंकि इंडेक्स बिडरेक्शनल हैं।

लेकिन अगर आप एक बहु-स्तंभ सूचकांक जहां स्तंभ दिशाओं अलग है, उदाहरण के लिए की जरूरत है आपको लगता है कि जैसे कई quires चलाएँ:

SELECT * from MyTable WHERE ColumnA = 1 ORDER BY ColumnB ASC, ColumnC DESC 

आप निम्नलिखित सूचकांक की जरूरत: (Columna, ColumnB एएससी, ColumnC DESC)

आप MySQL में इस पैरामीटर संस्करण 8 से पहले साथ एक सूचकांक बना सकते हैं, लेकिन यह वास्तव में धीरे-धीरे बनाया गया (कॉलम एएससी, कॉलम बीएस एएससी, कॉलमैक एएससी)

तो आपकी क्वेरी पूरी तरह से उस इंडेक्स का उपयोग नहीं कर सका - यह केवल कॉलम ए के लिए अनइंडेक्सड (फाइलोर्ट) का उपयोग करते समय इंडेक्स से कॉलम ए और बी लेता था।

यह अब और नहीं होगा MySQL 8.0 और बाद के संस्करण में एक मुद्दा। https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html

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