क्या MySQL में "रैखिक सूचकांक" एक रैखिक ऑपरेशन है?


20

मेरा मतलब निम्नलिखित है:

यदि nपंक्तियों के साथ एक मेज पर एक सूचकांक बनाने में tसमय लगता है। 1000*nलगभग 1000*tसमय लेने के साथ एक ही टेबल पर एक इंडेक्स बनाएंगे ।

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

जवाबों:


16

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

यदि आपके सभी प्रासंगिक डेटा पेज रैम में फिट होते हैं और पहले से ही रैम में हैं, और इंडेक्स भी फिट होगा, और आपका डीबीएमएस इंडेक्स पेज को निर्माण पूरा होने से पहले लिखने के लिए मजबूर नहीं करता है (इसलिए इंडेक्स ब्लॉक डिस्क पर कई बार अपडेट नहीं होते हैं) ऑपरेशन), फिर डिस्क पर परिणामी इंडेक्स लिखने की गति सॉर्ट करने के लिए लिए गए समय की तुलना में अधिक महत्वपूर्ण होगी - इसलिए आप पा सकते हैं कि आप पंक्तियों की संख्या और इंडेक्स निर्माण में लगने वाले समय के बीच एक रैखिक संबंध के करीब पहुंच सकते हैं - लेकिन अगर आप बदतर स्थिति को मान लेते हैं तो आपको अप्रिय आश्चर्य होने की संभावना कम है!

याद रखें कि जब तक आप ऑपरेशन के दौरान उत्पादन डेटाबेस तक पहुंच को रोकने नहीं जा रहे हैं, तब तक कोई भी इंडेक्स क्रिएट IO बैंडविड्थ और / या अन्य गतिविधि के साथ लॉक करने के लिए प्रतिस्पर्धा करेगा, इसलिए यदि आप अपने समय का आकलन परीक्षण कर रहे हैं, तो आपको इसके लिए प्रयास करना चाहिए। किसी अन्य सिस्टम पर भले ही वह पहचान योग्य हो।


7

यह भी ध्यान देने योग्य है कि यदि आप टेबल के लिए स्पिंडल से इंडेक्स के लिए स्पिंडल को विभाजित कर सकते हैं तो आप एक समय में दो डिस्क से काम कर पाएंगे (फिर भी बीच में डिस्क कंट्रोलर की गति तक सीमित रह सकते हैं, यदि एक RAID या पसंद है, लेकिन फिर भी यह एक डिस्क से अधिक तेज़ होगा)।

मुझे लगता है कि एक इंडेक्स बनाना पूरी तरह से एक सिमुल-रीड-राइट ऑपरेशन नहीं है, लेकिन यह चीजों को काफी गति देता है।

गुफाएँ: मैं खुद एक MSSQL आदमी हूँ, और इसलिए मैं MySQL के बारे में निश्चित नहीं हूँ, लेकिन मुझे लगता है कि स्पिंडल को विभाजित करने की अवधारणा SQLServer और Oracle के लिए विशिष्ट नहीं है (जहाँ मैंने सुना है कि यह वहाँ पर भी बात करता है, IICC) )। मुझे नहीं पता कि इस अवधारणा को स्थापित करने के बारे में कैसे जाना जाए। लेकिन SQLServer के संदर्भ में इसका मतलब होगा एक अलग फाइलग्रुप के अलावा PRIMARYऔर इंडेक्स को दूसरे फाइलग्रुप पर रखना, अन्य फाइलग्रुप के साथ स्पिंडल के सेट को सौंपा गया है जिसमें शामिल नहीं है PRIMARY(फ़ाइल प्लेसमेंट के लिए स्पिंडल प्लेसमेंट दिया गया है। पूरी तरह से एक और कहानी है)


1
ओरेकल में बहुत ही समान बात - केवल फ़ाइल समूहों को एक टेबलस्पेस
जो

2

1

निर्भर करता है।

चर # 1: यदि MySQL मक्खी पर अनुक्रमणिका (तों) का निर्माण करना चुनता है, या तब तक प्रतीक्षा करता है जब तक कि सभी आंकड़े अंदर नहीं हो जाते हैं, तब अनुक्रमणिका बनाने के लिए एक प्रकार, आदि करें। नोट: UNIQUE इंडेक्स (मुझे लगता है) को फ्लाई पर बनाया जाना है ताकि UNIQUEness को सत्यापित किया जा सके। InnoDB के लिए प्राथमिक कुंजी डेटा (या आप इसके विपरीत बता सकते हैं) के साथ संग्रहित किया जाता है, ताकि बेतरतीब ढंग से होना चाहिए।

चर # 2: सूचकांक डेटा को ट्रैक करता है (जैसे AUTO_INCREMENT या टाइमस्टैम्प) बनाम रैंडम (GUID, MD5), या कहीं बीच में (भाग संख्या, नाम, friend_id)।

चर # 3 (यदि इंडेक्स फ़्लाई पर बनाया गया है): इंडेक्स कैश (key_buffer या innodb_buffer_pool) में फिट हो सकता है, या डिस्क पर फैल सकता है।

इंडेक्स जो डेटा को ट्रैक करते हैं, वे # 1 के उत्तर की परवाह किए बिना, कुशल और वस्तुतः रैखिक होते हैं।

रैंडम आईडी एक दर्द है। यदि सूचकांक कैश में फिट नहीं होगा, तो इसे बनाने का समय अन्य चर की परवाह किए बिना, रैखिक से बहुत खराब होगा। (मैं इस मामले में रोलांडो से असहमत हूं।) पीके के लिए एक GUID के साथ एक विशाल InnoDB तालिका INSERT में बहुत धीमी है - 100 पंक्तियों पर योजना / साधारण डिस्क के लिए सेकंड; यदि आप SSD है तो शायद 1000। लोड डेटा और बैच INSERTs आप यादृच्छिक भंडारण की सुस्ती पिछले नहीं मिलेगा।

3.53 के माध्यम से 5.6 - बहुत कुछ नहीं बदला है।

एकाधिक स्पिंडल? RAID स्ट्रिपिंग लगभग किसी भी स्थिति में बेहतर है कि मैन्युअल रूप से इसे यहां और वहां से असाइन किया जाए। मैनुअल बंटवारे से असंतुलित स्थितियां पैदा होती हैं - डेटा डिस्क पर एक टेबल स्कैन अटक जाता है; इंडेक्स-ओनली ऑपरेशन इंडेक्स डिस्क पर अटक जाता है; एक अकेला क्वेरी पहले इंडेक्स डिस्क को हिट करता है, फिर डेटा डिस्क (ओवरलैप नहीं); आदि।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.