2010-12-08 9 views
5

मेरे पास दो कक्षाएं हैं, Foo और Bar। प्रत्येक Bar में कई Foo एस होंगे। Foo एस कई Bar एस में हो सकता है लेकिन प्रत्येक Foo केवल एक बार दिए गए Bar में हो सकता है। मेरे पास निम्न तालिका संरचना है:क्या दो स्तंभों पर एक MySQL प्राथमिक कुंजी दूसरे कॉलम पर क्वेरी के साथ मदद करता है?

CREATE TABLE `bar_foos` (
    `bar_id` INT UNSIGNED NOT NULL, 
    `foo_id` INT UNSIGNED NOT NULL, 
    PRIMARY KEY (`bar_id` , `foo_id`) 
); 

यह मेरे कई से अधिक रिश्तों के लिए ठीक काम करना चाहिए। मेरा सवाल है, अगर मैं चाहता हूं कि मेरा कोड यह देखने में सक्षम हो कि Foo किसी भी Bar एस, आईई द्वारा उपयोग में है या नहीं। उपयोगकर्ता बताने के लिए "यह फू हटाया नहीं जा सकता है क्योंकि यह 5 बार्स द्वारा उपयोग में है", प्राथमिक कुंजी सूचकांक

SELECT * FROM `bar_foos` WHERE `foo_id`=2 

या

SELECT COUNT(*) FROM `bar_foos` WHERE `foo_id`=2 

या की तरह एक प्रश्न के साथ मेरी मदद करता है, मुझे क्या करना अकेले foo_id कॉलम के लिए एक अलग इंडेक्स की आवश्यकता है?

+0

यदि यह एक से कई रिश्ते हैं, तो आपको 'bar_foos' तालिका क्यों चाहिए? क्यों न केवल 'bar.foo_id' का उपयोग करें (और उस क्षेत्र पर भी एक अनुक्रमणिका है)? –

+1

"फूओस कई बार्स में हो सकता है लेकिन प्रत्येक फू केवल एक बार बार में ही हो सकता है।" यह एक से अधिक रिश्ते नहीं है, यह अलग संयोजनों के साथ कई से अधिक है। –

+0

@ माइकल: @ डीजेकोबसन नाक पर आ गया, मैं इसे इस तरह से नहीं कर सकता – Josh

उत्तर

6

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

"तालिका एक बहु-स्तंभ अनुक्रमणिका है, सूचकांक के किसी भी वाम-पंथी उपसर्ग अनुकूलक द्वारा पंक्तियों को खोजने के लिए इस्तेमाल किया जा सकता। उदाहरण के लिए, यदि आप (col1 पर तीन स्तंभ अनुक्रमणिका है , col2, col3), आपने खोज क्षमताओं को सूचीबद्ध किया है (col1), (col1, col2), और (col1, col2, col3)।

MySQL एक अनुक्रमणिका का उपयोग नहीं कर सकता है यदि कॉलम बाएं सबसे उपसर्ग नहीं बनाते हैं अनुक्रमणिका।"

+2

तो उसे अपनी इंडेक्स रणनीति को उलट करने की जरूरत है? – jcolebrand

+0

उस विशेष क्वेरी के लिए, उसे foo_id के साथ एकमात्र या बाएं कॉलम के रूप में एक और अनुक्रमणिका की आवश्यकता होगी –

1

नहीं पहले या दोनों पर मदद करता है।

+0

भले ही यह प्राथमिक है? – Josh

+3

प्राथमिकता सिर्फ एक अद्वितीय अनुक्रमणिका है। इसका एकमात्र कारण यह है कि इसका एक विशेष नाम यह है कि कुछ स्टोरेज इंजन (उदा। इनो डीबी) इंडेक्स में से किसी एक द्वारा डिस्क पर ऑर्डर डेटा। –

2

एक शब्द में, नहीं।

एक आंशिक प्रमुख खोज पर, यह केवल मदद करता है, तो आंशिक क्रम में वे सूचकांक में हैं में हैं जाएगा। इसलिए, यदि कुंजी तीन भाग कुंजी थी और आपने भागों 1 & 2 पर खोज की, लेकिन 3 नहीं, तो इससे मदद मिलेगी। यदि आपने भागों 2 & 3 पर खोज की है, तो यह नहीं होगा।

3

कल्पना कीजिए कि क्या आप एक फोन बुक खोज रहे थे जहां पहले नाम पर द्वितीयक अनुक्रमणिका के साथ अंतिम नाम पर एक इंडेक्स है। (और यह वास्तव में यह कैसे होता है।)

  • अच्छा - जहां last_name = 'स्मिथ' और first_name = 'जॉन'
  • अच्छा - जहां last_name = 'स्मिथ'
  • बुरा - जहां first_name = ' जॉन '

' जॉन फोन बुक में किसी भी पेज पर दिखाई दे सकता है, इसलिए यह इसे कम नहीं करता है।

तो यदि आप पहले नामों पर इंडेक्स का उपयोग करना चाहते हैं तो आपको 'एक नई फोन बुक प्रिंट करना होगा जो नामों को पहले नाम से ऑर्डर करता है। या, डेटाबेस में, पहले कॉलम इंडेक्स के रूप में पहले नामों के साथ एक नई अनुक्रमणिका बनाएं।

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