2011-06-01 7 views
13

क्या है इसलिए मेरे पास एक प्रश्न है।सूचकांक या अद्वितीय? बेहतर MySQL

कहें कि आपके पास एक टेबल अनुरोध है, जो एक ग्राफ का प्रतिनिधित्व करता है। अनुरोध तालिका, ए, बी, समय में 3 कॉलम हैं। ए -> बी समय पर। तो प्रत्येक पंक्ति का प्रतिनिधित्व करने वाला समय ए (अनुरोधकर्ता) से बी (अनुरोधकर्ता) से समय टी पर एक निर्देशित कनेक्शन है (समय केवल डेटा व्यवस्थित करने के लिए है, वास्तव में किसी अन्य चीज़ के लिए नहीं)।

तो अगर अनुरोध कहें तो 1,000,000 पंक्तियां तेज हैं तो तेज़ी से क्या है।
इंडेक्स (ए, बी) इंडेक्स (ए) और इंडेक्स (बी) अद्वितीय (ए, बी)?

धन्यवाद दोस्तों! और ए, बी वचरर (32) (एमडी 5)

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

तो बयान दिखेगा।

कोई नया अनुरोध?

SELECT B, time 
FROM requests 
WHERE A='$id'; 

क्या ए से बी से अनुरोध है?

SELECT time 
FROM requests 
WHERE A='$A' and B='$B'; 
+1

"तेज़" इस बात पर निर्भर करता है कि आप डेटा के खिलाफ खोज करने की योजना कैसे बनाते हैं। एक सामान्य क्वेरी कैसा दिखता है? –

+0

ओको, बस आइटम अपडेट किया गया। क्षमा करें मैं प्रश्न पूछना भूल गया। मैं संभवतः बी – Michael

+0

से अनुरोध करने के लिए नए अनुरोधों के लिए कई और अनुरोध कर रहा हूं, मैं सलाह देता हूं कि ए और बी दोनों पर एक सामान्य इंडेक्स डालें, इससे आपको अच्छा प्रदर्शन और लचीलापन मिलेगा। एक अद्वितीय बाधा का उपयोग न करें, एमडी 5 टकरा सकता है लेकिन बाधाएं छोटी हैं, आप चीजों को बहुत धीमा कर देंगे। अंतिम बिंदु MD5 अब सुरक्षित नहीं है, 'चलना SHA512 जैसे अधिक सुरक्षित हैश पर नहीं चलता है। – Johan

उत्तर

3

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

अधिक समग्र अनुक्रमित पर:

http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html

इसके अलावा, विशिष्टता (ए, बी) में कोई फर्क नहीं करना चाहिए जब तक कि आपके आवश्यकता है कि बी सबसे पर एक एक बार अनुरोध कर सकते हैं है।

+0

@ एजे, मैं यहां एक कंपाउंड इंडेक्स के लिए उपयोग केस देखने में असफल रहा, अगर मैं सिर्फ बी देखना चाहता हूं, तो मैं कंपाउंड इंडेक्स से खराब हूं। कृपया मुझे ज्ञान दो? – Johan

+2

@ जोहान - मैनुअल पढ़ें। "यदि तालिका में एकाधिक-कॉलम इंडेक्स है, तो सूचकांक के किसी भी बाएं उपसर्ग को पंक्तियों को खोजने के लिए ऑप्टिमाइज़र द्वारा उपयोग किया जा सकता है। उदाहरण के लिए, यदि आपके पास तीन कॉलम इंडेक्स है (col1, col2, col3), तो आपने अनुक्रमित किया है खोज क्षमताओं (col1), (col1, col2), और (col1, col2, col3)। "ओपी ने दो प्रश्न निर्दिष्ट किए हैं: एक जो ए और एक में मानों की खोज करता है जो ए, बी में मानों की खोज करता है। अगर ** ** बी पर खोज करने की आवश्यकता है, तो ओपी को यह निर्दिष्ट करने की आवश्यकता है और मैं अपना जवाब संशोधित कर दूंगा। –

+2

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

34

सूचकांक और अद्वितीय दो पूरी तरह से अलग अवधारणाएं हैं।

इंडेक्स
एक सूचकांक एक छिपा अतिरिक्त स्तंभ एक ही डेटा अपने वास्तविक डेटा के लिए सूचक के साथ हल कर पकड़े है। एक सूचकांक का उपयोग करके आप

  1. जल्दी जब order by का उपयोग कर, क्योंकि आइटम presorted कर रहे हैं किसी विशेष आइटम
  2. जल्दी आइटम
  3. सहेजें समय (x और y के बीच) की एक श्रृंखला मिल पा सकते हैं
  4. सहेजें समय group by का उपयोग करते समय समूह को समान वस्तुओं से मेल खाने की आवश्यकता है

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

अनन्य (सूचकांक)
आप डुप्लिकेट मानों से बचने के लिए आप उस पर एक unique index डाल कर सकते हैं।यह उपर्युक्त सभी करेगा, लेकिन प्रत्येक अपडेट पर अतिरिक्त चेक जोड़ें और यह जांचने के लिए कि क्या मान पहले से ही डेटाबेस में नहीं हैं, डालें। यदि आप एक अद्वितीय कॉलम पर डुप्लिकेट पंक्ति डालने का प्रयास करते हैं, तो MySQL एक त्रुटि देगा और आपके सम्मिलन को अस्वीकार कर देगा।
(आप एक सूची का उपयोग किए बिना एक पंक्ति unique नहीं कर सकते हैं) के इंडेक्स

उपयोग आवेषण और नीचे अपडेट धीमा कर देती है।
अद्वितीय इंडेक्स का उपयोग तब भी धीमा हो जाता है।

हालांकि इंडेक्स select बहुत तेज है, एक बहुत कुछ।
Unique कुछ भी तेज़ नहीं करता है यह सुनिश्चित करता है कि आप गलती से डुप्लिकेट पंक्ति नहीं डालते हैं।

अनुक्रमित और जब उपयोग करने के लिए जब नहीं
हर क्षेत्र पर एक सूचकांक न रखें। जैसा कि ऊपर बताया गया है, यह आपको insert एस और update एस धीमा कर देगा।
हमेशा शामिल मानदंडों पर एक सूचकांक डालें। और गंभीरता से where खंड में उपयोग किए जाने वाले कॉलम पर एक इंडेक्स डालने पर विचार करें।
MySQL एक इंडेक्स का उपयोग करने से इनकार कर देगा यदि आपकी पंक्तियों में से 50% फ़ील्ड में समान मान हैं, तो बूलियन (वाई/एन) फ़ील्ड पर इंडेक्स के बारे में भूल जाएं, 99% समय वे काम नहीं करेंगे।
(कम प्रमुखता क्षेत्रों में इंडेक्स उपयोगी नहीं हैं)

हमेशा एक प्राथमिक कुंजी
हमेशा अपनी मेज पर एक प्राथमिक कुंजी असाइन हालांकि आवंटित। पसंदीदा प्रकार integer autoincrement। यदि आप प्राथमिक कुंजी असाइन नहीं करते हैं, तो MySQL आपके लिए 'छिपी हुई प्राथमिक कुंजी' (प्रकार पूर्णांक autoincrement) असाइन करेगा, लेकिन आप उद्धरण को तेज करने या अपनी पंक्तियों की पहचान करने के लिए छिपे हुए पीके का उपयोग नहीं कर सकते हैं और वहां हैं छुपे हुए पीके के साथ अन्य धीमी समस्याओं का एक मेजबान जो उन्हें बहुत बुरी तरह चूसता है।

उम्मीद है कि इससे मदद मिलती है।

लिंक:
कैसे MySQL अनुक्रमित उपयोग करता है: http://dev.mysql.com/doc/refman/5.5/en/mysql-indexes.html
अनुक्रमित उपयोग कब करें: http://www.howtoforge.com/when-to-use-indexes-in-mysql-databases
कि सामान का अधिक: http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm
अंत में यहाँ घात में रहना है, तो आप MySQL के बारे में अधिक जानना चाहते हैं: http://planet.mysql.com/

+0

ग्रेट उत्तर बीटीडब्ल्यू, मैं सिर्फ इन पुराने सवालों में से एक की समीक्षा कर रहा था। यह अधिक जानकारीपूर्ण उत्तर है! :) – Michael

+0

महान उत्तर, छुपा प्राथमिक कुंजी पर टिप के लिए धन्यवाद – wolfgang