अपूर्ण विनिर्देश के आधार पर, मैं यह करूँगा:
CREATE UNIQUE INDEX stock_UX1 ON stock (storeid,seedid,stk)
यह अनुक्रमणिका storeid
. के साथ अनुक्रमणिका की आवश्यकता को पूरा करेगी प्रमुख स्तंभ के रूप में। (और हम जानते हैं कि यह आवश्यकता होगी यदि यह InnoDB और storeid
. है एक विदेशी कुंजी है।)
इतनी छोटी तालिका पंक्ति के साथ, मैं आगे बढ़ूंगा और इसे एक कवरिंग इंडेक्स बनाउंगा, और सभी कॉलम शामिल करूंगा। फिर अंतर्निहित तालिका में डेटा पृष्ठों को देखे बिना अनुक्रमणिका पृष्ठों से सीधे प्रश्नों को संतुष्ट किया जा सकता है।
चूँकि हम जानते हैं कि (seedid,storeid)
अद्वितीय है (प्राथमिक कुंजी के रूप में दिया गया), हम जानते हैं (storeid,seedid)
अद्वितीय भी है, इसलिए हम अनुक्रमणिका को अद्वितीय घोषित कर सकते हैं।
अन्य विकल्प हैं; हमें ऊपर वह अनुक्रमणिका बनाने की आवश्यकता नहीं है। हम इसके बजाय बस ऐसा कर सकते हैं:
CREATE INDEX stock_IX2 ON stock (storeid)
लेकिन यह लगभग समान मात्रा में स्थान का उपयोग करेगा, और अधिक से अधिक संभावित प्रश्नों के लिए फायदेमंद नहीं होगा।
द्वितीयक अनुक्रमणिका में तालिका की प्राथमिक कुंजी होगी; ताकि दूसरी अनुक्रमणिका में seedid
. शामिल हो कॉलम, तालिका की प्राथमिक कुंजी दी गई है। यानी इंडेक्स इसके बराबर है:
CREATE INDEX stock_IX3 ON stock (storeid,seedid)
और हम जानते हैं कि उन दो स्तंभों का संयोजन अद्वितीय है, इसलिए हम UNIQUE कीवर्ड शामिल कर सकते हैं
CREATE UNIQUE INDEX stock_UX4 ON stock (storeid,seedid)
अगर हम फॉर्म की किसी क्वेरी पर EXPLAIN करते हैं
EXPLAIN
SELECT t.storeid
, t.seedid
, t.stk
FROM stock t
WHERE t.storeid = 'foo'
हमें सेकेंडरी इंडेक्स पर रेंज स्कैन ऑपरेशन देखने की संभावना है; लेकिन stk
. का मान प्राप्त करना कॉलम को अंतर्निहित तालिका में डेटा पृष्ठों को देखने की आवश्यकता होगी। stk
. सहित द्वितीयक अनुक्रमणिका में स्तंभ अनुक्रमणिका को आवरण बना देगा क्वेरी के लिए index. उत्तर में सबसे पहले अनुशंसित सूचकांक के साथ, हम EXPLAIN
. की अपेक्षा करते हैं "इंडेक्स का उपयोग करना" दिखाने के लिए आउटपुट।