2010-06-15 13 views
162

मैं अब थोड़ी देर के लिए मेरी MySQL डेटाबेस पर अनुक्रमित उपयोग कर रहे हैं, लेकिन कभी ठीक से उनके बारे में सीखा है। आम तौर पर मुझे लगता है कि मैं खोज की जाएगी या एक WHERE खंड का उपयोग कर, लेकिन कभी कभी यह बहुत काले और सफेद प्रतीत नहीं होता है का चयन किसी भी खेतों पर एक सूचकांक डाल दिया।MySQL अनुक्रमित - सर्वोत्तम प्रथाओं क्या हैं?

MySQL अनुक्रमित के लिए सर्वोत्तम प्रथाओं क्या हैं?

उदाहरण स्थितियों/दुविधाओं:

एक मेज छह कॉलम और के सभी उन हैं, है, तो चाहिए मैं सूचकांक उनमें से उन सभी को या कोई नहीं?

नकारात्मक प्रदर्शन क्या हैं अनुक्रमण के प्रभावों?

अगर मैं एक VARCHAR 2500 स्तंभ जो अपनी साइट के कुछ हिस्सों से खोजा है, मैं सूचकांक यह होना चाहिए?

+3

आपको शायद प्रश्न को पुनः प्राप्त करना चाहिए। किसी भी डेटाबेस मॉडल को ऑप्टिमाइज़ेशन के लिए इंडेक्स का विकल्प एक महत्वपूर्ण हिस्सा है। और मेरे दृष्टिकोण के लिए php से असंबंधित। – VGE

उत्तर

8

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

इंडेक्स से बचें: यदि आपको बेहतर प्रदर्शन करने में मदद करने के लिए किसी विशेष अनुक्रमणिका की आवश्यकता नहीं है, तो इसे न बनाएं।

डिस्क स्पेस: एक अनुक्रमणिका डिस्क स्थान लेती है, और एकाधिक अनुक्रमणिका संगत रूप से अधिक जगह लेती हैं। इससे कोई सूचकांक नहीं होने की तुलना में आप टेबल आकार सीमा तक अधिक तेज़ी से पहुंच सकते हैं। जहां भी संभव हो इंडेक्स से बचें।

Takeaway: क्या सूचकांक

3

1/2) इंडेक्स कुछ चुनिंदा कार्रवाइयों को गति खत्म नहीं हुआ है, लेकिन वे डालने, अद्यतन की तरह अन्य कार्यों को धीमा और हटा देता है। यह एक अच्छा संतुलन हो सकता है।

3) एक पूरा टेक्स्ट सूचकांक, चाहिए मैं सूचकांक या उनमें से उन सभी को कोई भी उपयोग करते हैं या शायद

+0

'रोकने डालने, अद्यतन की तरह अन्य कार्यों को धीमा और deletes' आप उपयोग कर सकते हैं करने के लिए' लेन-देन शुरू करें, '' अपने कोड, '' COMMIT' कौन मदद कर सकते हैं से बचने के 'अन्य कार्यों down' धीमा, के रूप में यह केवल एक बार बाधाओं की जांच करेगा। कैवेट: यदि आप 'प्रतिस्थापन INTO' और आपके' SQL_MODE' <> 'STRICT_ALL_TABLES' या 'पारंपरिक' का उपयोग करते हैं तो 'थोक लोड' प्रतिस्थापन को प्रतिस्थापित और डुप्लिकेट डालने से अनदेखा कर देगा। – JayRizzo

19

स्फिंक्स एक मेज छह स्तंभ हैं और उन सभी हैं, तो

हैं आप फ़ील्ड के आधार पर किसी फ़ील्ड पर खोज कर रहे हैं या कई फ़ील्ड का उपयोग करके कुछ खोज कर रहे हैं? कौन से फ़ील्ड अधिक पर खोज रहे हैं? फ़ील्ड प्रकार क्या हैं? (उदाहरण के लिए VARCHARs की तुलना में इंडेक्स INTs पर बेहतर काम करता है) क्या आपने चल रहे प्रश्नों पर EXPLAIN का उपयोग करने का प्रयास किया है?

अद्यतन और आवेषण धीमा होगा अनुक्रमण की negetive प्रदर्शन प्रभावों क्या कर रहे हैं। अतिरिक्त भंडारण स्थान की आवश्यकता भी है, लेकिन यह इन दिनों सामान्य रूप से महत्वहीन है।

मैं एक VARCHAR 2500 स्तंभ जो अपनी साइट के कुछ हिस्सों से खोजने योग्य है, मैं सूचकांक यह

नहीं है, जब तक कि यह अद्वितीय है (जिसका अर्थ है यह पहले से ही अनुक्रमित) या आप केवल के लिए खोज करनी चाहिए उस क्षेत्र पर सटीक मैचों (LIKE या mySQL की पूर्ण टेक्स्ट खोज का उपयोग नहीं)।

आम तौर पर मुझे लगता है कि मैं खोज की जाएगी या का चयन किसी भी खेतों पर एक सूचकांक डाल का उपयोग कर एक कहां खंड

मैं था सामान्य रूप से सूचकांक क्षेत्रों है कि सबसे अधिक पूछे जाते हैं, और फिर INTs/बूलियन्स/ENUMs बल्कि वे क्षेत्र जो VARCHARS हैं। भूलें, अक्सर आपको व्यक्तिगत फ़ील्ड पर एक इंडेक्स की बजाय संयुक्त फ़ील्ड पर एक इंडेक्स बनाने की आवश्यकता होती है। एक्सप्लाइन का प्रयोग करें, और धीमी लॉग की जांच करें।

42

More Mastering the Art of Indexing जैसी प्रस्तुतियों की जांच करें।

अपडेट 12/2012: मैंने अपनी एक नई प्रस्तुति पोस्ट की है: How to Design Indexes, Really। मैंने अक्टूबर 2012 में सांता क्लारा में ज़ेंडकॉन में और दिसंबर 2012 में परकोना लाइव लंदन में प्रस्तुत किया।

सर्वोत्तम इंडेक्स डिज़ाइन करना एक ऐसी प्रक्रिया है जिसे आपके ऐप में चलने वाले प्रश्नों से मेल खाना पड़ेगा।

यह किसी भी सामान्य प्रयोजन नियमों के बारे में जो कॉलम सूचकांक करने के लिए सबसे अच्छा कर रहे हैं की सिफारिश करना मुश्किल है, या कि क्या आप सूचकांक सभी स्तंभों, कोई कॉलम है, जो अनुक्रमित एकाधिक स्तंभों अवधि चाहिए, आदि यह प्रश्नों आप चलाने की आवश्यकता पर निर्भर करता है चाहिए ।

हां, कुछ ओवरहेड है इसलिए आपको अनिवार्य रूप से इंडेक्स नहीं बनाना चाहिए। लेकिन आप इंडेक्स बना सकते हैं जो आपको जल्दी से चलाने के लिए आवश्यक प्रश्नों का लाभ देते हैं। इंडेक्स का ओवरहेड आम तौर पर इसके लाभ से बहुत अधिक है।

एक स्तंभ VARCHAR (2500) है कि के लिए, आप शायद एक FULLTEXT index या फिर उपसर्ग सूचकांक का उपयोग करना चाहते: यदि आप शब्दों के लिए खोज कर रहे हैं

CREATE INDEX i ON SomeTable(longVarchar(100)); 

ध्यान दें कि एक पारंपरिक सूचकांक मदद नहीं कर सकता है कि उस लंबे वर्चर के बीच में हो सकता है। इसके लिए, एक पूर्ण टेक्स्ट सूचकांक का उपयोग करें।

+2

आपको बहुत बहुत धन्यवाद। http://www.slideshare.net/matsunobu/more-mastering-the-art-of-indexing?next_slideshow=1 वास्तव में बहुत उपयोगी था। – RY35

37

मैं अन्य उत्तर में अच्छी सलाह के कुछ दोहराया जाएगा नहीं है, लेकिन जोड़ देगा:

यौगिक सूचकांकों

आप यौगिक सूचकांक बना सकते हैं - एक सूचकांक कि कई कॉलम शामिल हैं। MySQL इन्हें से से दाएं से उपयोग कर सकता है।तो अगर आप हैं:

Table A 
Id 
Name 
Category 
Age 
Description 

यदि आप एक यौगिक सूचकांक भी शामिल है कि आदेश में नाम/श्रेणी/आयु है, ये कहां खंड सूचकांक का प्रयोग करेंगे:

WHERE Name='Eric' and Category='A' 

WHERE Name='Eric' and Category='A' and Age > 18 

लेकिन

WHERE Category='A' and Age > 18 

उस अनुक्रमणिका का उपयोग नहीं करेगा क्योंकि सबकुछ बाएं से दाएं से उपयोग किया जाना चाहिए।

के बारे में बताएं

उपयोग के बारे में बताएं/समझने के लिए सूचकांक MySQL के लिए उपलब्ध हैं और जो एक का चयन करता है यह वास्तव में विस्तारित की व्याख्या करना। MySQL केवल एक प्रति प्रश्न का उपयोग करेगा।

EXPLAIN EXTENDED SELECT * from Table WHERE Something='ABC' 

धीरे क्वेरी लॉग

slow query log चालू जिन तक प्रश्नों धीमी गति से चल रहे हैं देखने के लिए।

वाइड कॉलम

आप एक विस्तृत स्तंभ जहां भेद की सबसे पहले कई पात्रों में होता है, तो आप अपने सूचकांक में केवल पहले एन वर्णों का उपयोग कर सकते हैं। उदाहरण: हमारे पास वर्चर (255) के रूप में परिभाषित एक संदर्भ संख्या कॉलम है, लेकिन 97% मामलों में, संदर्भ संख्या 10 वर्ण या उससे कम है। मैंने इंडेक्स को केवल पहले 10 अक्षरों को देखने और बेहतर प्रदर्शन में सुधार करने के लिए बदल दिया।

+0

मेरे पास अंतिम भाग के बारे में एक प्रश्न है। मैंने कहीं पढ़ा है कि यदि आप वचरर के साथ एक कॉलम बनाते हैं तो आपको इसे हमेशा 255 पर सेट करना चाहिए। अब आपने कहा था कि इस प्रकार के कॉलम पर सेट एक इंडेक्स केवल पहले 10 अक्षरों को देखने के लिए सीमित हो सकता है। आप यह कैसे कर सकते हैं? – AlexioVay

+0

'जहां नाम =' एरिक 'और आयु> 18' काम होगा? –

188

आपको निश्चित रूप से अनुक्रमण पर कुछ समय पढ़ना चाहिए, इसके बारे में बहुत कुछ लिखा है, और यह समझना महत्वपूर्ण है कि क्या हो रहा है।

व्यापक रूप से बोलते हुए, और सूचकांक तालिका के पंक्तियों पर ऑर्डरिंग लगाता है।

सादगी के लिए, कल्पना करें कि एक टेबल केवल एक बड़ी सीएसवी फ़ाइल है। जब भी कोई पंक्ति डाली जाती है, तो अंत में पर डाली जाती है। इसलिए तालिका का "प्राकृतिक" क्रम केवल वह क्रम है जिसमें पंक्तियां डाली गई थीं।

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

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

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

अब आपके पास सभी पंक्तियों को खोजने के लिए एक अच्छी रणनीति है जहां तीसरे कॉलम का मान "एम" है। उदाहरण के लिए, आप binary search कर सकते हैं!जबकि टेबल स्कैन के लिए आपको एन पंक्तियां देखने की आवश्यकता होती है (जहां एन पंक्तियों की संख्या है), बाइनरी खोज केवल तभी आवश्यक है कि आप लॉग-एन इंडेक्स प्रविष्टियों को सबसे बुरे मामले में देखें। वाह, यह निश्चित रूप से बहुत आसान है!

बेशक, यदि आपके पास यह अनुक्रमणिका है, और आप तालिका में पंक्तियां जोड़ रहे हैं (अंत में, क्योंकि हमारी वैचारिक तालिका काम करती है), आपको प्रत्येक बार इंडेक्स को अपडेट करने की आवश्यकता है। तो जब आप नई पंक्तियां लिख रहे हों तो आप थोड़ा और काम करते हैं, लेकिन जब आप कुछ खोज रहे होते हैं तो आप एक टन बचाते हैं।

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

दूसरी तरफ, पढ़ना बहुत तेज़ हो जाता है।

उम्मीद है कि आपके पहले दो प्रश्नों को शामिल किया गया है (जैसा कि अन्य ने उत्तर दिया है - आपको सही संतुलन खोजने की आवश्यकता है)।

आपका तीसरा परिदृश्य थोड़ा और जटिल है। यदि आप LIKE का उपयोग कर रहे हैं, तो इंडेक्सिंग इंजन आमतौर पर आपकी पढ़ने की गति को पहले "%" तक मदद करेंगे। दूसरे शब्दों में, यदि आप 'foo% bar%' जैसे कॉलम को चुन रहे हैं, तो डेटाबेस सभी पंक्तियों को खोजने के लिए इंडेक्स का उपयोग करेगा जहां स्तंभ "foo" से शुरू होता है, और फिर सबसेट खोजने के लिए उस मध्यवर्ती पंक्ति को स्कैन करने की आवश्यकता होती है जिसमें "बार" है। चुनें ... जहां '% बार%' कॉलम इंडेक्स का उपयोग नहीं कर सकता है। मुझे उम्मीद है कि आप क्यों देख सकते हैं।

अंत में, आपको एक से अधिक कॉलम पर इंडेक्स के बारे में सोचना शुरू करना होगा। अवधारणा वही है, और समान सामानों के समान व्यवहार करती है - अनिवार्य रूप से, यदि आपके पास (ए, बी, सी) पर एक इंडेक्स है, तो इंजन इंडेक्स का उपयोग बाएं से दाएं से बेहतर तरीके से कर सकता है। तो कॉलम पर एक खोज (ए, बी, सी) इंडेक्स का उपयोग कर सकती है, जैसा कि एक (ए, बी) होगा। हालांकि, यदि आप खोज रहे थे तो इंजन को एक पूर्ण टेबल स्कैन करने की आवश्यकता होगी, जहां आप खोज रहे थे b = 5 और c = 1)

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

+8

'FULLTEXT' अनुक्रमणिका के बारे में क्या? क्या वे 'पसंद'% बार% 'जैसी शर्तों के साथ मदद कर सकते हैं? – Septagram

4

सामान्य रूप से, सूचकांक अतिरिक्त डिस्क स्थान का उपयोग करने और INSERT/UPDATE/DELETE प्रश्नों को धीमा करने के नुकसान के कारण, स्पीडअप डेटाबेस खोज में सहायता करते हैं। EXPLAIN का उपयोग करें और यह जानने के लिए परिणामों को पढ़ें कि MySQL आपके सूचकांक का उपयोग कब करता है।

यदि किसी तालिका में छह कॉलम हैं और उनमें से सभी खोजे जा सकते हैं, तो क्या मुझे उन सभी को सूचीबद्ध करना चाहिए या उनमें से कोई भी नहीं?

सभी छह स्तंभों को अनुक्रमणित करना हमेशा सर्वोत्तम अभ्यास नहीं होता है।

(ए) क्या आप विशिष्ट जानकारी खोजने के दौरान उन कॉलम का उपयोग करने जा रहे हैं?

(बी) तालिका में रिकॉर्ड्स की कुल राशि की तुलना में उन कॉलमों की चयनकता कितनी अलग है, कितनी अलग-अलग मूल्य संग्रहित हैं)?

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

अनुक्रमण के नकारात्मक प्रदर्शन प्रभाव क्या हैं?

पहले से ही उत्तर दिया गया: अतिरिक्त डिस्क स्थान, सम्मिलित करें - अद्यतन - हटाएं के दौरान कम प्रदर्शन।

यदि मेरे पास एक वर्चर 2500 कॉलम है जो मेरी साइट के कुछ हिस्सों से खोजने योग्य है, तो क्या मुझे इसे अनुक्रमित करना चाहिए?

FULLTEXT Index आज़माएं।

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