2009-07-11 9 views
14

एक दिन मुझे संदेह है कि मुझे हैडूप सीखना होगा और यह सब डेटा एक गैर-संरचित डेटाबेस में स्थानांतरित करना होगा, लेकिन मुझे लगता है कि इस तरह की छोटी अवधि में प्रदर्शन में गिरावट आई है समय की।6 मिलियन पंक्ति तालिका पर MySQL प्रदर्शन

मेरे पास 6 मिलियन पंक्तियों के साथ एक MySQL तालिका है। मैं इस तालिका पर एक बहुत ही सरल क्वेरी कर रहा हूं, और मेरा मानना ​​है कि मेरे पास सभी सही इंडेक्स हैं।

क्वेरी

 
SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date 

रिटर्न

 
id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE updateshows  range date_idx date_idx 7 NULL 648997 Using where 

समझाने जहाँ तक मैं बता सकता हूँ तो मैं सही सूचकांक का उपयोग कर रहा है, लेकिन इस क्वेरी 11 सेकंड चलाने के लिए ले जा रहा है।

डेटाबेस MyISAM है, और phpMyAdmin का कहना है कि तालिका 1.0GiB है।

कोई विचार यहाँ है?

संपादित: दिनांक_आईडीएक्स दिनांक और विषम कॉलम दोनों इंडेक्स है। क्या वे दो पृथक इंडेक्स हो सकते हैं?

+0

आपके पास कौन सी अनुक्रमणिका है? – Pafjo

+0

आपकी व्याख्या क्वेरी में कहा गया है कि इसे 648 997 पंक्तियों को स्कैन करना है (शायद यह सूचकांक का कुशलता से पर्याप्त उपयोग नहीं करता है। मैं अलग-अलग कॉलम को इंडेक्स करता हूं)। वास्तव में कितनी पंक्तियां वापस आती हैं? – nos

+0

अब स्थिति क्या है –

उत्तर

38

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

ALTER TABLE events ADD INDEX indexNameHere (venid, date, time); 
इस सूचकांक के साथ

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

mysql> EXPLAIN SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date; 

id select_type table type possible_keys  key  [..] Extra 
1 SIMPLE events range date_idx, indexNameHere indexNameHere Using index, Using where 
+4

+1: इंडेक्स को कवर करना आवश्यक है। सावधानीपूर्वक अनुक्रमित और सावधानीपूर्वक पूछताछ के साथ, 6 मिमी पंक्तियों का कोई बड़ा सौदा नहीं है। –

+3

अद्भुत !! धन्यवाद। मुझे एहसास नहीं हुआ कि मुझे इंडेक्स के साथ चयनित फ़ील्ड को कवर करने की आवश्यकता है। मैंने सोचा कि यह केवल वही फ़ील्ड था जिसे अनुक्रमित करने की आवश्यकता थी। – pedalpete

+1

यदि आपको याद है, तो इंडेक्स के साथ नई क्वेरी पर निष्पादन समय क्या था? –

2

एक महत्वपूर्ण यह है कि venid और तारीख तक फैला जोड़ने का प्रयास करें (या दूसरी तरह के आसपास, या दोनों ...)

+0

जब आप कहते हैं कि 'एक कुंजी जोड़ें', तो क्या आपका मतलब सूचकांक है? मैंने अपनी प्रविष्टि को राज्य में संपादित किया है कि date_idx तारीख और शिरापरक दोनों फ़ील्ड पर है। – pedalpete

+0

आपको 'टाइम', –

+0

धन्यवाद माइकल, मुझे एहसास नहीं हुआ कि चयन फ़ील्ड को भी अनुक्रमित किया जाना चाहिए। चीयर्स। – pedalpete

1

venid स्तंभ पर एक सूचकांक डाल की कोशिश करो।

+0

मैंने अभी अपनी प्रविष्टि संपादित की है, date_idx तारीख और venid फ़ील्ड दोनों पर है। क्षमा करें मैंने इसे मूल रूप से नहीं रखा था। – pedalpete

2

मैं कल्पना कर सकते हैं कि एक 6M पंक्ति तालिका काफी सामान्य तकनीकों के साथ अनुकूलित करने में सक्षम होना चाहिए:

अब, उम्मीद है कि आप निम्नलिखित जब आप क्वेरी समझाने देखेंगे।

मुझे लगता है कि आपके पास एक समर्पित डेटाबेस सर्वर है, और इसमें राम की समझदार मात्रा है (8 जी न्यूनतम कहें)।

आप यह सुनिश्चित करना चाहते हैं कि आपने अपने रैम को कुशलतापूर्वक उपयोग करने के लिए mysql को ट्यून किया है। यदि आप 32-बिट ओएस चला रहे हैं, तो नहीं। यदि आप MyISAM का उपयोग कर रहे हैं, तो अपने कुंजी के बफर को एक अपरिहार्य अनुपात का उपयोग करने के लिए ट्यून करें, लेकिन आपके राम के बहुत ज्यादा नहीं।

किसी भी मामले में आप उत्पादन-ग्रेड हार्डवेयर पर दोहराए गए प्रदर्शन परीक्षण को चलाने के लिए चाहते हैं।

+0

धन्यवाद @MarkR , और बहुत देर से जवाब के लिए खेद है। यह दूसरी वेबसाइट थी जिसे मैंने कभी बनाया था, इसलिए समर्पित डीबी सर्वर या ऐसा कुछ भी नहीं था। मैंने इसे एक ही बॉक्स पर सभी प्रक्रियाओं के साथ कुछ सालों तक चलाया। कोई समस्या नहीं, मैं आश्चर्यचकित था कि MySQL कितनी अच्छी तरह से 8 मिलियन + पंक्तियों तक पहुंच गया। जब मैं उस बिंदु पर पहुंचा तो मैं पुराने डेटा को संग्रहीत करता। – pedalpete

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