क्या कोई UNIQUE बाधा स्वचालित रूप से फ़ील्ड (ओं) पर एक INDEX बनाती है?


97

क्या मुझे स्तंभ पर अलग-अलग सूचकांकemail (उद्देश्यों को खोजने के लिए) परिभाषित करना चाहिए , या क्या UNIQ_EMAIL_USERबाधा के साथ सूचकांक "स्वचालित रूप से" जोड़ा गया है ?

CREATE TABLE IF NOT EXISTS `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `first` varchar(255) NOT NULL,
  `last` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_SLUG` (`slug`),
  UNIQUE KEY `UNIQ_EMAIL_USER` (`email`,`user_id`),
  KEY `IDX_USER` (`user_id`)
) ENGINE=InnoDB;

संपादित करें : जैसा कि कॉर्बिन द्वारा सुझाया गया था, मैं EXPLAIN SELECT * FROM customer WHERE email = 'address'खाली पटल पर उपस्थित था । यह परिणाम है, मुझे नहीं पता कि इसकी व्याख्या कैसे करें:

id select_type type possible_keys key  key_len ref  rows Extra
1  SIMPLE      ALL  NULL          NULL NULL    NULL 1    Using where

तालिका में IXD_EMAIL को जोड़ने पर वही क्वेरी दिखाता है:

id select_type type possible_keys key       key_len ref   rows Extra
1  SIMPLE      ref  IDX_EMAIL     IDX_EMAIL 257     const 1    Using where

1
एक UNIQUE बाधा तकनीकी रूप से सूचकांक की आवश्यकता नहीं है ... लेकिन यह सुनिश्चित नहीं है कि मानक इसे कैसे परिभाषित करता है या MySQL (जो बैकेंड, btw?) इसे लागू करता है। सभी मैं MySQL में मैन्युअल रूप से जल्दी से पा सकते हैं "एक अद्वितीय सूचकांक एक बाधा बनाता है जैसे कि सूचकांक में सभी मान अलग-अलग होने चाहिए।"

आपको व्यक्तिगत बनाम कवरिंग (AKA समग्र - एक से अधिक कॉलम) अनुक्रमित के साथ लागू करने और परीक्षण करने की आवश्यकता है। यह उपयोग और डेटा पर निर्भर करता है।
OMG पोंजी

3
मुझे 99% यकीन है कि यह वास्तव में एक सूचकांक बनाता है। बस एक यूनीक के साथ एक टेबल बनाएं फिर एक सेलेक्ट पर एक एक्सप्लेन जहां से करें।
कॉर्बिन

@ कॉर्बिन ने किया, मुझे परिणाम की व्याख्या कैसे करनी चाहिए?
गार्मो

क्या इसने एक सूचकांक के रूप में अद्वितीय अवरोध का उपयोग किया था? आपको रास्ते में एक बड़ी तालिका का उपयोग करने की आवश्यकता हो सकती है, या यह सिर्फ एक टेबल स्कैन कर सकता है।
कॉर्बिन

जवाबों:


115

एक अद्वितीय कुंजी इंडेक्स का एक विशेष मामला है, एक नियमित इंडेक्स की तरह काम करता है जिसमें विशिष्टता के लिए अतिरिक्त जाँच होती है। उपयोग करके SHOW INDEXES FROM customerआप देख सकते हैं कि आपकी अनूठी कुंजियाँ वास्तव में बी-ट्री प्रकार इंडेक्स हैं।

एक समग्र सूचकांक पर (email, user_id)पर्याप्त है, आप केवल ईमेल पर एक अलग सूचकांक जरूरत नहीं है - MySQL एक समग्र सूचकांक का सबसे बाईं ओर के कुछ हिस्सों का उपयोग कर सकते हैं। कुछ सीमावर्ती मामले हो सकते हैं जहां एक सूचकांक का आकार आपके प्रश्नों को धीमा कर सकता है, लेकिन आपको उनके बारे में चिंता नहीं करनी चाहिए जब तक आप वास्तव में उनमें भाग नहीं लेते हैं।

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


तो EXPLAINपरीक्षण खाली तालिका के कारण मिथ्या मूल्यों को दर्शाता है?
ग्रेमो

मुझे यकीन नहीं है कि आप उस व्याख्या परिणाम को प्राप्त करने में कैसे कामयाब रहे, मैंने अभी आपकी तालिका परिभाषा की नकल की है और उसी व्याख्या को संभव कुंजी के रूप में UNIQ_EMAIL_USER दिखाता है, क्या आप कृपया इसे रीचेक कर सकते हैं?
पोट्रम

ठीक है, चाल मिली। जब बाधा को user_idपहले प्रयोग करके परिभाषित किया जाता है और तब emailयह दिखाई नहीं देता है EXPLAIN। क्या आप इससे जागरुक हैं?
गार्मो

10
यह काम नहीं करता है क्योंकि ईमेल (user_id, ईमेल) जोड़ी का सबसे बड़ा हिस्सा नहीं है। आप केवल सबसे दाहिने हिस्से का उपयोग करके अपनी पंक्ति को खोजने के लिए b- ट्री के नीचे नहीं जा सकते।
पोट्रम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.