2011-12-13 21 views
6

संभव डुप्लिकेट:MySQL डिफ़ॉल्ट आदेश पर निर्भर करता है, जहां

CREATE TABLE IF NOT EXISTS `table_test` (
    `id` mediumint(8) unsigned NOT NULL, 
    `country` enum('AF','AX','AL') DEFAULT NULL, 
    `number` tinyint(3) unsigned DEFAULT NULL, 
    `sort_order` double unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `country` (`country`), 
    KEY `id` (`id`,`country`) 
) ENGINE=MEMORY DEFAULT CHARSET=latin1; 

मैं एक मेज है जिसके लिए मैं बदल:
Default sort-ordering in MySQL (ALTER TABLE … ORDER BY …;)

मैं इस तरह एक मेज है डिफ़ॉल्ट क्रम जैसे:

ALTER TABLE test_table ORDER BY sort_order ASC; 

यह तालिका कभी अपडेट नहीं होती है और इसके रिकॉर्ड के दौरान कोई रिकॉर्ड हटाया या जोड़ा नहीं जाता है।

SELECT * FROM test_table LIMIT 10 

यह सही क्रम में 10 रिकॉर्ड रिटर्न: यह सब अगर मैं folowwing क्वेरी उपयोग करती हैं इसलिए काम करने के लिए लगता है।

और अगर मैं का उपयोग करें:

SELECT * FROM test_table WHERE num=3 

यह सही क्रम में परिणाम देता है।

लेकिन अगर मैं

SELECT * FROM test_table WHERE country='AX' 

कर यह उलट क्रम में परिणाम देगा।

क्या कोई मुझे बता सकता है कि यह कैसे हो सकता है?

+0

'देश' अनुक्रमित है और शायद 'देश' सूचकांक' sort_order' के समान क्रम में नहीं है, या यह बिल्कुल आदेश नहीं दिया गया है। या आपके मामले में यह गलती से रिवर्स ऑर्डर किया गया है ... – Vili

+0

_ORDER BY इनो डीडी टेबल के लिए समझ में नहीं आता है जिसमें उपयोगकर्ता द्वारा परिभाषित क्लस्टर्ड इंडेक्स (प्राथमिक कुंजी या नॉन यूनिक इंडेक्स) शामिल है। यदि कोई मौजूद है तो InnoDB हमेशा ऐसी अनुक्रमणिका के अनुसार तालिका पंक्तियों का ऑर्डर करता है ._ - http://dev.mysql.com/doc/refman/5.1/en/alter-table.html - मुझे पता है कि आपका टेबल इंजन स्मृति है, फिर भी मुझे लगता है कि मामला वही है। – Vili

+0

यह ऐसा ही प्रतीत होता है: http://stackoverflow.com/questions/725717/default-sort-ordering-in-mysql-alter-table-order-by .. दस्तावेज़ों को छोड़कर: ध्यान दें कि तालिका नहीं रहती आवेषण और हटाए जाने के बाद इस क्रम में। यह विकल्प प्राथमिक रूप से उपयोगी होता है जब आप जानते हैं कि ज्यादातर समय में आप निश्चित रूप से पंक्तियों से पूछताछ करते हैं। तालिका में बड़े बदलावों के बाद इस विकल्प का उपयोग करके, आप उच्च प्रदर्शन प्राप्त करने में सक्षम हो सकते हैं। कुछ मामलों में, यह MySQL के लिए सॉर्टिंग को आसान बना सकता है यदि तालिका कॉलम द्वारा क्रमबद्ध है जिसे आप बाद में ऑर्डर करना चाहते हैं ... मई, मई ... – xQbert

उत्तर

5

तालिका पर ORDER निर्दिष्ट करना इंजन के लिए एक ही आदेश के साथ प्रश्नों को तेज़ी से बढ़ाने में मदद करता है। यह mysql को हमेशा एक ही क्रम के साथ परिणाम वापस करने के लिए मजबूर नहीं करेगा।

इस में वर्णित:।। http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

"आदेश द्वारा आप एक विशेष क्रम में पंक्तियों के साथ नई तालिका बनाने के लिए ध्यान दें कि तालिका आवेषण के बाद इस क्रम में नहीं रहता और हटाता सक्षम बनाता है यह विकल्प उपयोगी है मुख्य रूप से जब आप जानते हैं कि आप अधिकतर समय में किसी निश्चित क्रम में पंक्तियों से पूछताछ करते हैं। तालिका में बड़े बदलावों के बाद इस विकल्प का उपयोग करके, आप उच्च प्रदर्शन प्राप्त कर सकते हैं। कुछ मामलों में, यह सॉर्टिंग को आसान बना सकता है MySQL के लिए यदि तालिका कॉलम द्वारा क्रमबद्ध है जिसे आप बाद में ऑर्डर करना चाहते हैं। "

तो आपको अपने प्रश्नों में ऑर्डर द्वारा अभिव्यक्ति का भी उपयोग करना होगा।

+0

+1 और यदि यह पर्याप्त स्पष्ट नहीं है: * डिफ़ॉल्ट आदेश की अवधारणा * एसक्यूएल भाषा में मौजूद नहीं है। यह जानबूझकर और डिज़ाइन द्वारा है। –

+0

आईएमओ बेहतर जवाब है क्योंकि साइट्स डॉक का संदर्भ उन्हें संदर्भित करता है और सभी प्रश्नों के अनुसार ऑर्डर जोड़ने के लिए सीधे इंगित करता है। – xQbert

+0

यह खोज का उत्तर नहीं देता है आयन क्यों होता है। मैं नहीं जानना चाहता कि यह करने का पसंदीदा तरीका है, लेकिन मुझे यह जानने की जरूरत है कि इंजन सॉर्टिंग ऑर्डर को उलट क्यों देता है। इसके अलावा, प्रलेखन यह नहीं बताता है कि मुझे – Nin

1

तुम क्यों इस तरह क्वेरी कोशिश नहीं:

SELECT * FROM test_table ORDER BY sort_order ASC LIMIT 10; 
SELECT * FROM test_table WHERE num=3 ORDER BY sort_order ASC; 
SELECT * FROM test_table WHERE country='AX' ORDER BY sort_order ASC; 
+1

पर भरोसा न करें क्योंकि यह सवाल नहीं है। प्रश्न यह है कि MYSQL में टेबल पर एक सुविधा क्यों होती है जो डिफ़ॉल्ट आदेश की अनुमति देती है यदि यह काम नहीं करती है। (या यह उनके कार्यान्वयन में क्यों काम नहीं कर रहा है – xQbert

+0

उतना ही मुझे परिणाम सेट पर काम करना चाहिए जितना मुझे पता है। मैंने पहली बार सुना है कि आप बदलाव में बदलाव कर सकते हैं। अगर मैं समाधान प्राप्त करता हूं तो मैं इसके बारे में पढ़ने की कोशिश कर रहा हूं मैं आपको बता दूंगा .. –

3

मैं देश पर अपने सूचकांक के डिफ़ॉल्ट आदेश लगता DESC है। इस वजह से, यदि इसका उपयोग किया जाता है तो आपको "गलत" आदेश मिलता है और अन्य सभी मामलों में यह अलग होता है। सुनिश्चित नहीं है कि MySQL में इंडेक्स का ऑर्डर निर्दिष्ट करना संभव है या नहीं, लेकिन मुझे लगता है कि यह है।

लेकिन फिर भी मुझे यकीन नहीं है कि अगर आप एक निर्दिष्ट नहीं करते हैं तो आप आदेश पर भरोसा कर सकते हैं। बस अपने सभी प्रश्नों के लिए ORDER BY कथन जोड़ें।

+0

'बस अपने सभी प्रश्नों के लिए ORDER BY कथन जोड़ें।' यह सही उत्तर है। एसक्यूएल ** कभी भी ** परिणाम सेट के किसी भी विशेष क्रम की गारंटी नहीं देता है जब तक आप 'ऑर्डर बीई' का उपयोग नहीं करते खंड। इससे कोई फर्क नहीं पड़ता कि पंक्तियों में पंक्तियों को भौतिक रूप से संग्रहीत किया जाता है। – Hammerite

+0

और MySQL ** ** ** में 'डीईएससी 'इंडेक्स नहीं है। –

1

कारण है कि आप देख इस व्यवहार शायद इस प्रकार है: क्योंकि country द्वारा WHERE खंड फिल्टर, MySQL country पर सूचकांक का उपयोग करता पंक्तियों वापस करने लगता है।सबसे अधिक संभावना है कि इंडेक्स पंक्तियों को country द्वारा क्रमबद्ध किया जाता है, फिर id (तालिका की प्राथमिक कुंजी) द्वारा क्रमबद्ध किया जाता है। इसका मतलब है कि पंक्तियों को पुनर्प्राप्त करने के लिए MySQL के लिए सबसे प्रभावी तरीका इंडेक्स में संदर्भित क्रम में सूचकांक द्वारा संदर्भित पंक्तियों को पढ़ना है। डिस्क पर पंक्तियां दिखाई देने का आदेश इसलिए अप्रासंगिक है।

MySQL आप एक सूचकांक के आदेश निर्दिष्ट करने की अनुमति वाक्य रचना प्रदान करता है, लेकिन this is currently ignored:

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

आपको वांछित क्रम में पंक्तियों को वापस करने की गारंटी देने के लिए आपको ORDER BY अपने प्रश्नों के खंड जोड़ना होगा। संयोग से, यह हमेशा वैसे भी मामला है; एसक्यूएल इस बात की कोई गारंटी नहीं देता है कि पंक्तियों को किसी भी विशेष क्रम में वापस कर दिया जाएगा, भले ही पंक्तियां शारीरिक रूप से कैसे संग्रहीत हों (जब तक कि ORDER BY खंड मौजूद न हो)।

+0

क्वेरी में ORDER का उपयोग करना चाहिए यदि यह मामला यादृच्छिक क्रम में sort_order दिखाना चाहिए लेकिन यह इसे पूरी तरह से डीईएससी आदेश में दिखाता है। – Nin

+1

सिर्फ इसलिए कि यह आपके इच्छित क्रम में नहीं है, इसका मतलब यह नहीं है कि यह * यादृच्छिक * ऑर्डर में है। यह किसी भी क्रम में MySQL को आपको दिखाने के लिए सबसे सुविधाजनक लगता है। जब टेबल को डीईएससी आदेश में पंक्तियों के साथ व्यवस्थित किया जाता है तो यह ऐसा होता है कि वह ऑर्डर आपके इच्छित क्रम के साथ मेल खाता है। – Hammerite

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