2009-08-18 3 views
17

मैं चाहेकॉलम खोज प्रदर्शन के लिए अद्वितीय इंडेक्स बेहतर हैं? (PGSQL और MySQL)

CREATE INDEX idx ON tbl (columns); 

बनाम

CREATE UNIQUE INDEX idx ON tbl (columns); 

जब अनुक्रमित स्तंभ (रों) स्कैनिंग PostgreSQL या MySQL कार्यान्वयन में एक महत्वपूर्ण एल्गोरिथम प्रदर्शन लाभ है जानने के लिए उत्सुक हूँ, या चाहे UNIQUE कीवर्ड केवल सूचकांक के साथ एक अद्वितीय बाधा पेश करता है।

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

तो, मेरे प्रश्न के प्रयोजनों के लिए, मान लें कि मूल्यों का वितरण अपेक्षाकृत अलग और समान है।

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

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

उत्तर

15

यदि आपका डेटा अद्वितीय है, तो आपको उन पर UNIQUE अनुक्रमणिका बनाना चाहिए।

यह कोई अतिरिक्त ओवरहेड का तात्पर्य नहीं है और कुछ मामलों में अनुकूलक के निर्णयों को प्रभावित करता है ताकि यह एक बेहतर एल्गोरिदम चुन सके।

SQL Server में और PostgreSQL में, उदाहरण के लिए, आप प्रकार एक UNIQUE कुंजी पर, अनुकूलक कि बाद इस्तेमाल ORDER BY खंड पर ध्यान नहीं देता है, तो (क्योंकि वे अप्रासंगिक हैं), मैं। ई। इस क्वेरी:

SELECT * 
FROM mytable 
ORDER BY 
     col_unique, other_col 
LIMIT 10 

col_unique पर एक सूचकांक का उपयोग करेगा और नहीं होगा प्रकार पर other_col यह बेकार है, क्योंकि।

इस क्वेरी:

SELECT * 
FROM mytable 
WHERE mycol IN 
     (
     SELECT othercol 
     FROM othertable 
     ) 

भी (के रूप में एक SEMI JOIN के खिलाफ) एक INNER JOIN में बदल दिया जाएगा अगर वहाँ othertable.othercol पर एक UNIQUE सूचकांक है।

एक सूचकांक हमेशा पंक्ति के लिए सूचक किसी तरह का (PostgreSQL में ctid, MyISAM में पंक्ति सूचक, प्राथमिक कुंजी/InnoDB में uniquifier) ​​शामिल हैं और पत्तियों, इन संकेत पर क्रमबद्ध किया जाता तो वास्तव में हर सूचकांक पत्ती अद्वितीय है कुछ रास्ता है (हालांकि यह स्पष्ट नहीं हो सकता है)।

प्रदर्शन जानकारी के लिए अपने ब्लॉग में इस लेख देखें:

2

ठीक है, आम तौर पर अनुक्रमणिका बी पेड़, हैश नहीं (वहाँ हैश आधारित अनुक्रमित रहे हैं, लेकिन सबसे आम सूचकांक हैं (कम से कम PostgreSQL में) बी पेड़ पर आधार है)।

गति के लिए - अनूठा होना चाहिए - जब इंडेक्स स्कैनिंग को दिए गए मान के साथ पंक्ति मिलती है, तो यह खोजना नहीं है कि इस मूल्य के साथ कोई अन्य पंक्तियां हैं या नहीं, और स्कैनिंग को पूरी तरह स्कैनिंग कर सकते हैं।

3

अद्वितीय बाधा रखने के लिए अद्यतन/सम्मिलन संचालन के दौरान एक छोटा सा जुर्माना है। यह सुनिश्चित करने के लिए कि विशिष्टता बाधा का उल्लंघन नहीं किया गया है, इसे सम्मिलित/अद्यतन ऑपरेशन से पहले खोजना है।

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