2010-08-16 12 views
5

मैं इस परिदृश्य पर है: एक MySQL डेटाबेस में, मैं 2 MyISAM तालिकाओं, 42 लाख पंक्तियों के साथ एक है, और 320 मिलियन पंक्तियों के साथ एक और है। निम्नलिखित तालिकाओं के लिए स्कीमा है:MySQL में शामिल होने के बावजूद शो अच्छी योजना व्याख्या के साथ धीमी गति से क्वेरी

Table1 (4.2M पंक्तियों)

F1 INTEGER UNSIGNED NOT NULL PRIMARY KEY 
f2 varchar(40) 
f3 varchar(40) 
f4 varchar(40) 
f5 varchar(40) 
f6 smallint(6) 
f7 smallint(6) 
f8 varchar(40) 
f9 varchar(40) 
f10 smallint(6) 
f11 varchar(10) 
f12 tinyint(4) 
f13 smallint(6) 
f14 text 

तालिका 2 (320M पंक्तियों)

F1 INTEGER UNSIGNED NOT NULL PRIMARY KEY 
f2 INTEGER UNSIGNED NOT NULL 

तालिका 2 एक अलग डेटाबेस में है, लेकिन मैं एक संग्रहीत उपयोग कर रहा हूँ प्रक्रिया जो दो तालिकाओं से पूछताछ करता है। दो तालिकाओं के बीच संबंध यह है कि Table1.F1 के लिए लगभग हो सकता है। Table2.F1 (विदेशी कुंजी) कौन-से मिलान में 100 पंक्तियाँ, और Table2.f2 के लिए मूल्य इन मिलान किया चाबी के लिए लौटा दी जाएगी। मैं (, f3 (10) f2 (15)) के बाद Table1 पर और एक सूचकांक IX2 (F1, F2) और IX3 (F2) तालिका में 2

प्रश्नों मैं चला रहा हूँ कर रहे हैं एक सूचकांक IX1 है:

SELECT g.F1 
FROM DB1.Table1 g 
INNER JOIN DB2.Table2 gp ON g.F1 = gp.F1 
WHERE (gp.f2 = 452677825) AND 
(g.f2 = 'A string value') LIMIT 0,56 

इस क्वेरी कभी कभी बहुत तेजी से (< 1s), लेकिन स्ट्रिंग मान कि g.F2 प्रश्नों जो 11 और कभी कभी भी अधिक भी 30 सेकंड लेने के लिए होता है की तुलना में है बदल रहा है। मैं समझ नहीं पा रहा हूं कि ऐसा क्यों है। निष्पादित किए गए चयन पर EXPLAIN का आउटपुट निम्न है।

1, 'SIMPLE', 'g', 'ref', 'PRIMARY,IX1', 'IX1', '17', 'const', 901, 'Using where' 
1, 'SIMPLE', 'gp', 'ref', 'IX3,IX2', 'IX2', '8', 'DB1.g.F1,const', 1, 'Using index' 

जो काफी अच्छी निष्पादन योजना प्रतीत होता है। समझाने की शीर्ष पंक्ति में पंक्तियों की संख्या अधिकतम 2000 को जाता है, लेकिन मैं नहीं दिख रहा है यही कारण है कि इस प्रणाली परिणामों को एक दूसरे के एक अंश से अब किसी भी लेना चाहिए। मैं भी प्रश्न पर प्रोफाइलर भाग गया और पाया है कि प्रश्नों "भेजा जा रहा है डेटा" मंच पर समय की 99.9% खर्च कर रहे हैं। क्या कोई यह बता सकता है कि ऐसा क्यों है, और क्वेरी को अनुकूलित करने के लिए क्या किया जा सकता है?

अग्रिम धन्यवाद, टिम

+0

धीमे प्रदर्शन करने वाले प्रश्नों को भी अधिक डेटा लौटाते हैं? –

+0

हाय विल। आपके कमेंट के लिए धन्यवाद। प्रश्न सभी 56 पंक्तियों पर वापस आ जाएंगे क्योंकि मैं कथन सीमित कर रहा हूं। हालांकि, एक सामान्य नियम के रूप में, एक्स्पलाइन की शीर्ष पंक्ति में जितनी अधिक पंक्तियां होती हैं, उतना ही समय लगता है, लेकिन यह हमेशा ऐसा नहीं होता है। – Tim

+0

क्या तालिका 1 पर IX1 में f2 से शामिल वर्णों की संख्या में वृद्धि का प्रदर्शन प्रदर्शन पर कोई प्रभाव पड़ता है? विशेष रूप से, यह 40 को चीजों में सुधार करने के लिए बढ़ रहा है? –

उत्तर

1

मैं इस क्षेत्र में एक विशेषज्ञ नहीं हूँ, लेकिन यहाँ हैं कुछ विचार:

क्वेरी गति अधिक समय लग रहा है जब g.F2 परिवर्तन कैशिंग के कारण है। MySQL प्रत्येक क्वेरी के लिए परिणाम की बचत होगी (जब तक कैश भरा हुआ है), लेकिन नए प्रश्नों एक खाली कैश पर चलाए जा रहे हैं, ताकि वे अधिक समय लग सकता। आपको इस पर आधारित अनुकूलन नहीं करना चाहिए। where खंड में (How to measure accurately देखें)

मैं आपकी जानकारी से नहीं बता सकता g या gp तालिका अधिक से अधिक विशिष्टता है कि क्या (gp की तरह लगता है?), लेकिन आप बदले में सबक्वेरी की कोशिश कर सकते हैं। (How to force the inner query to execute first देखें)

रूपरेखा के बारे में, यह संभव आप राम आवंटन से अधिक (स्वैप का उपयोग कर प्रदर्शन के लिए विनाशकारी है) कि explain से स्पष्ट नहीं हो सकता है, या कि क्या explain इस मामले में सिर्फ गलत है की तरह एक भौतिक सीमा पर पहुंचने पर कर रहे हैं।

+0

हाय, आपकी टिप्पणी के लिए धन्यवाद। जैसा कि आपने सुझाव दिया है, अभी मैंने उपरोक्त क्वेरी को एक जॉइन के बजाय IN का उपयोग करने के लिए बदल दिया है। क्वेरी अब निम्नानुसार दिखती है: से चुनें g.F1 (डीबी 1.Table1 g से चुनें g.F1 जहां (g.f2 = 'abc')) जहां एएफ 1 में (डीबी 2 से जीपी.एफ 1 चुनें)। टेबल 2 जीपी WHERE (gp.f2 = 452677825)) LIMIT 0,56 और क्वेरी बहुत तेज (~ 1s, 2s अधिकतम) चलाती है। मेरा मिशन यह है कि यदि संभव हो तो इसे और भी कम करें! – Tim

0

क्या आप करने में सक्षम अपने my.cnf में सुधार करने की कोशिश कर सकते हैं कर रहे हैं, संपत्ति आप के साथ खेलना चाहते हैं key_buffer_size है। MyISAM इंडेक्स में संग्रहीत किया जाता है .MYI फ़ाइलें यदि आप इन्हें ढूंढते हैं और फ़ाइल आकारों को कुल करते हैं (जैसे ls -lh /var/lib/mysql/dbname/*.MYI) आप अनुमान लगा सकते हैं कि कुंजी बफर को फिट करने की आवश्यकता कितनी बड़ी है आपके सभी इंडेक्स में। MySQL दस्तावेज़ों में 25% सिस्टम मेमोरी से अधिक न होने की अनुशंसा की जाती है।

0

दो तालिकाओं के बीच संबंध Table1.F1 के लिए वहाँ लगभग अप करने के लिए हो सकता है। Table2.F1

में 100 पंक्तियों स्पष्ट करने के लिए, Table1.F1 और Table2.F1 एक-से-एक, या कई लोगों के लिए एक के बीच संबंध है? मेरे लिए, यह कथन एक से कई लोगों का तात्पर्य है, लेकिन स्कीमा से, प्रत्येक फ़ील्ड प्राथमिक (यानी अद्वितीय) कुंजी हैं।

किसी भी दर पर, मुझे संदेह है कि g.f2(15) की वर्दी समान नहीं है, और जब सांख्यिकीय आउटलाइर्स हिट होते हैं, तो प्रदर्शन तदनुसार घटता है।

SELECT f2(15) AS f2_15, COUNT(*) AS cnt 
FROM Table1 
GROUP BY f2(15) 
ORDER BY cnt DESC 

के परिणाम कुछ महत्वपूर्ण बाहरी कारकों के कारण दिखाने है?

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