क्या किसी क्षेत्र को विशिष्ट बनाकर उसे अनुक्रमित किया जाता है?


10

यदि मैं uniqueकिसी फ़ील्ड पर एक बाधा बनाता हूं , तो क्या मुझे स्केलेबल सम्मिलित समय प्राप्त करने के लिए उस फ़ील्ड पर एक इंडेक्स बनाने की भी आवश्यकता है? या यह मेरे लिए किया जाता है (भले ही इसका उपयोग करने वाला सूचकांक सार्वजनिक रूप से सुलभ न हो?)

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

मुझे इस क्षेत्र में खोज करने की कभी आवश्यकता नहीं होगी, इसलिए मैं बेकार सूचकांक नहीं बनाऊंगा। लेकिन मैं एक O(n)डालने का समय है की तुलना में एक बेकार सूचकांक होगा ।


2
जो मुझे पता है कि एक अद्वितीय सूचकांक का उपयोग करने के पीछे एक अद्वितीय बाधा लागू की जाती है। आप इस प्रश्न में इस स्थिति के बारे में कुछ राय देख सकते हैं: एक अद्वितीय सूचकांक के बजाय अद्वितीय अवरोध का उपयोग कब करें?
मैरियन १

@ उस लिंक के लिए धन्यवाद। यह बहुत ही आनंददायक था।
corsiKa

जवाबों:


2

--EDIT--

मेरा मूल उत्तर (नीचे) शायद आपके लिए बिल्कुल भी उपयोगी नहीं है क्योंकि यह uniqueबाधाओं के सवाल को संबोधित नहीं करता है । जैसा कि दूसरों ने कहा है, इन बाधाओं को आमतौर पर एक निहित अद्वितीय सूचकांक के साथ लागू किया जाता है। विशेष मामलों में यह सच नहीं हो सकता है (उदाहरण के disable novalidateलिए ओरेकल)।

सवाल यह हो सकता है: क्या एक सूचकांक के बिना विशिष्टता को लागू करना संभव है? आम तौर पर जवाब बोलना कोई बात नहीं है, लेकिन कुछ मामलों में क्लस्टर इंडेक्स का मतलब होगा कि इंडेक्स और टेबल एक ही वस्तु हैं।

- END EDIT--

आपने कहा था "मेरे पास O (n) इन्सर्ट टाइम होने की बजाय एक बेकार इंडेक्स होगा।", लेकिन सामान्य डेटाबेस में O (n) इन्सर्ट टाइम नहीं होता है। विचार करने के लिए दो मामले हैं:

  1. अनुक्रमणिका के साथ या उसके बिना एक सामान्य तालिका:

    नई पंक्तियों को ढेर के शीर्ष पर डंप किया जाता है। RDBMS शायद केवल 1 ब्लॉक को देखता है , इसलिए केवल O (1) नहीं बल्कि बहुत छोटा O (1) है।

    यदि तालिका में अनुक्रमित हैं, तो पंक्ति में एक सूचक को प्रत्येक में जोड़ा जाएगा। यह आमतौर पर एक ओ (लॉग (एन)) ऑपरेशन होगा।

  2. किसी प्रकार की क्लस्टरिंग के साथ एक तालिका, उदाहरण के लिए ओरेकल के लिए एक इंडेक्स ऑर्गेनाइज़्ड टेबल या क्लस्टर , या SQL सर्वर और अन्य के लिए क्लस्टर इंडेक्स :

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


लेकिन एक सूचकांक के बिना विशिष्टता के O(n)रूप में आप पूरी मेज की जाँच करनी होगी। यही मैं बचने की कोशिश कर रहा हूं।
corsiKa

यह वास्तव में इस सवाल का सबसे अच्छा जवाब है !!! +1
रोलैंडमाइसीडीडीबीए

@ ट्रिक - हां, मुझे पहली बार में गलत लगा। सूचकांक वह मूल्य है जो आप विशिष्टता की कमी के लिए भुगतान करते हैं मुझे डर है। क्या आप अपने मामले में संकुल सूचकांक का उपयोग कर सकते हैं?
जैक का कहना है कि topanswers.xyz

1
@JackPDougless मैं एक मानक "इंडेक्स" का उपयोग कर सकता हूं और एक O(lg n)सम्मिलित समय प्राप्त कर सकता हूं । वह कोई समस्या नहीं है। मेरा प्रश्न सिस्टम होगा, यह जानकर कि आपको एक सम्मिलित सम्मिलित समय प्राप्त करने के लिए उस सूचकांक की आवश्यकता है, मेरे लिए एक सूचकांक बनाएं।
corsiKa

2

प्राथमिक कुंजी> = UNIQUE> = INDEX == कुंजी

InnoDB डेटा पीके द्वारा आदेश दिया गया है। MyISAM PK, UNIQUE के समान कार्य करता है।

INSERT को आपके पास मौजूद हर इंडेक्स (किसी भी प्रकार) के लिए एक "पंक्ति" जोड़ना होगा। इसमें कुछ समय लगता है। (आमतौर पर बात करने के लिए पर्याप्त समय नहीं है।) अनुक्रमणिका सभी को बीट्री प्रारूप में संग्रहीत किया जाता है। MyISAM BTree ब्लॉक 1KB हैं; InnoDB 16KB का उपयोग करता है।

InnoDB में सम्मिलित करने से PK और डेटा एक साथ अपडेट होते हैं।

MyISAM में सम्मिलित करना आमतौर पर .MYD में डेटा को "जोड़" देता है। अलग-अलग, यह PK (यदि कोई हो) के लिए एक पंक्ति जोड़ता है।

INSERT को पहले यह सत्यापित करना होगा कि किसी भी PRIMARY या UNIQUE कुंजी के लिए कोई डुप्लिकेट कुंजी नहीं है। यह सूचकांक का उपयोग करके किया जाता है। और, इसलिए, UNIQUE और FOREIGN KEY CONSTRAINTs वास्तव में इंडेक्स क्यों बनाते हैं। यह O (logN) है, लेकिन आमतौर पर CPU, I / O नहीं, क्योंकि यदि कुशल कैशिंग है।


क्या आपके पास InnoDB कल्पना में एक प्रशस्ति पत्र है जो बताता है कि एक UNIQUEअवरोध उपयोगकर्ता के बिना एक इंडेक्स बनाएगा जो किसी को निर्दिष्ट करने के लिए बनाया जाएगा?
corsiKa

हम्म् ... नहीं, सिर्फ वर्षों का अनुभव।
रिक जेम्स

और यहां इसका परीक्षण करने का एक तरीका है ... किसी भी माध्यमिक अनुक्रमित के बिना एक तालिका बनाएं; do SHOW TABLE STATUS - Index_length हो जाएगा 0. फिर एक UNIQUE सूचकांक जोड़ें; टेबल स्टेटस अब कुछ दिखाएगा। (तालिका में गैर-तुच्छ मात्रा में डेटा डालना पड़ सकता है।)
रिक जेम्स

1

बोल्ड में सवाल का जवाब देने के लिए: हाँ, एक क्षेत्र को अद्वितीय बनाने से यह प्राथमिक कुंजी की तरह अनुक्रमित होता है। वास्तव में, मैंने प्राथमिक कुंजी के संबंध में एक अन्य प्रश्न में इस पर चर्चा की थी कि इसका स्वयं का नाम अन्य विशिष्ट (कैंडिडेट) कुंजी से अलग करने के लिए है

बाधाओं के लिए, इंडेक्स आपके लिए बनाए जाते हैं ताकि बाधा प्रतिमान सेटअप हो। आपको डुप्लिकेट इंडेक्स, यहां तक ​​कि UNIQUE कुंजियों को हटाने में सक्षम होना चाहिए, जब तक कि आपके द्वारा बनाई गई बाधा अन्य UNIQUE कुंजियों को संदर्भित नहीं करती है जो आप व्यक्तिगत रूप से बाधा प्रतिमान से अलग करते हैं।

आपको इस क्षेत्र की खोज करने की आवश्यकता नहीं हो सकती है, लेकिन MySQL को निश्चित रूप से कुंजियों की वैधता निर्धारित करने के लिए अपना मार्ग बनाना होगा और यह निर्धारित करना होगा कि ON DELETE CASCADE और ON UPDATE CASCADE संचालन कैसे करें।

UNIQUE इंडेक्स तालिका में हर पंक्ति में टुपल्स (सिंगलटन, पेयर, ट्रिपल, ..., एन-टुपल्स आदि) की विशिष्टता की गारंटी देता है।

इस तरह के डुप्लिकेट इंडेक्स को निकालना आपके विवेक पर है, बशर्ते आपके पास टेबल पर जाने के लिए बाधा नहीं है।


1
यह मेरे सवाल का जवाब नहीं है। मेरा प्रश्न सम्मिलित समय से संबंधित है। यदि आपके पास एक अद्वितीय बाधा है, तो सिस्टम को सम्मिलित करने से पहले फ़ील्ड की विशिष्टता सुनिश्चित करनी चाहिए - यदि फ़ील्ड पर कोई इंडेक्स नहीं है, तो उसे पूरी तालिका ( O(n)) खोजनी होगी । यदि कोई इंडेक्स है, तो लुकअप बहुत तेज होगा (शायद O(lg n))। यह मेरा मुद्दा है। मैं संदर्भात्मक अखंडता यांत्रिकी के बारे में अच्छी तरह से जानता हूं, मैं केवल प्रदर्शन के बारे में (इस प्रश्न के उद्देश्यों के लिए) चिंतित हूं।
corsiKa
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.