2011-02-04 3 views
7

मेरे पास एक बड़ी MyISAM तालिका है। यह 1 मिलियन पंक्तियों के करीब आ रहा है। यह मूल रूप से वस्तुओं की एक सूची और उनके बारे में कुछ जानकारी है।बनाम बराबर से अधिक क्यों MySQL SELECT में एक अंतर बनाता है?

  • प्राथमिक: आइटम आईडी
  • तारीख (तारीख) और col (int)

    दो सूचकांक रहे हैं।

    SELECT * FROM table WHERE date = '2011-02-01' AND col < 5 LIMIT 10 
    
    SELECT * FROM table WHERE date < '2011-02-01' AND col < 5 LIMIT 10 
    

    पहले एक खत्म ~ 0.0005 सेकंड में और ~ 0.05 सेकंड में दूसरा:

मैं दो प्रश्नों को चलाते हैं। यह 100 एक्स अंतर है। क्या यह मेरे लिए गलत है कि इन दोनों को लगभग एक ही गति से चलने की उम्मीद है? मुझे सूचकांक को बहुत अच्छी तरह समझना नहीं चाहिए। मैं दूसरी क्वेरी कैसे बढ़ा सकता हूं?

+0

दोनों प्रश्नों के लिए, कितने रिकॉर्ड पहले विधेय से मेल खाते हैं? –

+0

बराबर के लिए 40,000, कम से कम 55,000 के लिए, इसलिए यह कोई बड़ा अंतर नहीं है – burger

+0

@bigmac इंडेक्स प्रारूप को बदलने का प्रयास करें और देखें कि क्या होता है। –

उत्तर

2

माइस्क्ल के बावजूद यह मूल एल्गोरिदम सिद्धांत को उबालता है।

बड़े सेट पर संचालन से अधिक और कम पहचान पहचान संचालन से धीमी है। एक बड़े डेटा के साथ एक से अधिक या अधिक निर्धारित करने के लिए एक आदर्श डेटा संरचना सेट एक स्व संतुलन वृक्ष (बाइनरी या एन-पेड़) है। एक स्व संतुलित पेड़ पर सभी कम/अधिक खोजने के लिए सबसे खराब स्थिति परिदृश्य लॉग एन है।

पहचान लुकअप के लिए आदर्श डेटा संरचना एक हैशटेबल है। हैशटेबल्स का प्रदर्शन आमतौर पर ओ (1) उर्फ ​​निश्चित समय है। हालांकि हैशटेबल अधिक/कम के लिए अच्छा नहीं है।

आम तौर पर एक अच्छी तरह से संतुलित पेड़ हैशटेबल से थोड़ा कम प्रदर्शन करता है (इस प्रकार हैस्केल हैशटेबल के लिए पेड़ का उपयोग करने से कैसे दूर हो जाता है)।

इस प्रकार क्या Mysql इसके कि < आश्चर्य नहीं है की परवाह किए बिना,> धीमी है की तुलना में =

ओल्ड उत्तर नीचे:

क्योंकि पहले एक के बाद से अपनी '=' Hashtable देखने की तरह है (विशेष रूप से यदि आपकी अनुक्रमणिका एक हैशटेबल है) यह दूसरे की तुलना में तेज होगी जो इंडेक्स जैसे पेड़ के साथ बेहतर काम कर सकती है।

चूंकि MySQL सूचकांक प्रारूप को कॉन्फ़िगर करने की अनुमति देता है, इसलिए आप इसे बदलने का प्रयास कर सकते हैं, लेकिन मुझे यकीन है कि पहले हमेशा दूसरे की तुलना में तेज़ी से चलेंगे।

+0

CREATE INDEX पर दस्तावेज़ों का लिंक: http://dev.mysql.com/doc/refman/5.0/en/create-index.html –

+0

चूंकि मेरी तालिका MyISAM है, मेरे पास केवल एक BTREE अनुक्रमणिका हो सकती है। InnoDB भी BTREE है। मैं कम मुख्यधारा के भंडारण इंजन में स्विच करने के बारे में चिंतित हूं क्योंकि इसमें अन्य चेतावनियां शामिल हो सकती हैं जिन्हें मैं अभी तक नहीं जानता हूं। – burger

+0

यह http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html –

1

पहला व्यक्ति डेटा पर एक खोज करता है जहां दूसरा स्कैन के लिए जाता है। इसलिए समय अंतर के मुकाबले स्कैन हमेशा महंगा होते हैं।

इसकी तरह, स्कैन का मतलब पुस्तक के सभी पृष्ठों के माध्यम से चल रहा है, जहां खोज सीधे पृष्ठ संख्या पर कूद रही है।

आशा है कि इससे मदद मिल सकती है।

2

मुझे लगता है कि आपके पास तिथि कॉलम पर एक अनुक्रमणिका है। पहली क्वेरी इंडेक्स का उपयोग करती है, दूसरी क्वेरी शायद एक रैखिक स्कैन करता है (कम से कम डेटा के हिस्से में)। एक प्रत्यक्ष fetch रैखिक स्कैन से हमेशा तेज है।

2

MySQL डिफ़ॉल्ट रूप से बीटीआरई में अपनी अनुक्रमणिका को स्टोर करता है। सामान्य रूप से कोई हैशिंग नहीं है।

प्रदर्शन अंतर के लिए संक्षिप्त उत्तर यह है कि < फ़ॉर्म अधिक नोड्स का मूल्यांकन करता है तो = form।

सूचकांक कि तुम वहाँ पर मिल गया है (तिथि, col) मान मोटे तौर पर एक फोन की किताब की तरह संग्रहीत करता है:

2011-01-01, col=1, row_ptr 
2011-01-01, col=2, row_ptr 
2011-01-01, col=3, row_ptr 
etc... 
2011-02-01, col=1, row_ptr 
2011-02-01, col=2, row_ptr 
2011-02-01, col=3, row_ptr 
etc... 
2011-02-02, col=1, row_ptr 
2011-02-02, col=2, row_ptr 
etc... 

... आरोही आकार बी के पेड़ नोड्स हल कर में (2011-01- 01, col = 1) < (2011-01-01, col = 2) < (2011-01-02, col = 1)।

आपका प्रश्न अनिवार्य रूप से के बीच अंतर पूछ रहा है:

  1. 'ए'
  2. के साथ शुरू अंतिम नाम 'स्मिथ' और प्रथम नाम के साथ सभी फोन नंबर सभी फ़ोन नंबर से पहले आने का पता लगाएं का पता लगाएं 'स्मिथ' और पहले नाम 'ए' से शुरू हो रहा है।

यह स्पष्ट होना चाहिए कि # 1 इतना तेज़ क्यों है # 2।

मेमोरी/डिस्क ट्रांसफर दक्षता और ढेर आवंटन (= कम तरीके से स्थानांतरण <) पर विचार करता है जो कि समय की एक अनिश्चित राशि के लिए खाता है लेकिन डेटा के वितरण और विशिष्ट स्थान पर निर्भर करता है 2011-02-01, col = min (col) कुंजी रिकॉर्ड।

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