क्या MySQL इंडेक्स प्रमुख कुंजी कॉलमों को स्वचालित रूप से बनाता है?


261

क्या MySQL इंडेक्स प्रमुख कुंजी कॉलमों को स्वचालित रूप से बनाता है?

जवाबों:


229

हां, लेकिन केवल पर । इनोडब वर्तमान में एकमात्र भेज दिया गया तालिका प्रारूप है जिसमें विदेशी कुंजियों को लागू किया गया है।


1
क्या आपके पास यह मानने का कोई कारण है कि MySQL कभी भी किसी अन्य तालिका प्रकार के लिए गैर-अनुक्रमित स्तंभों पर विदेशी कुंजी की अनुमति देगा?
रॉबर्ट गैंबल

मैं वास्तव में इसका जवाब नहीं दे सका। आप मारिया और फाल्कन स्टोरेज इंजन को देखना चाह सकते हैं जो MySQL 6.0 में रिलीज़ होने हैं और देखें कि क्या वे गैर-अनुक्रमित कॉलम पर विदेशी कुंजी का समर्थन करते हैं।
ग्रांट लिम्बर्ग

जाहिरा तौर पर यह सच नहीं है। मेरे पास एक बड़ी तालिका (1 मिलियन रिकॉर्ड) और गिनती (*) है जहां fkey =? 15 सेकंड लगेंगे। Fkey कॉलम पर एक इंडेक्स जोड़ा गया है, और चीजें अब एक सेकंड के नीचे जाती हैं।
AbiusX

एक और तालिका और 10 मिलियन रिकॉर्ड के साथ एक ही प्रयोग। यह toc MySQL 5.1 InnoDB है। तालिका में तीन फ़ील्ड हैं, एक प्राथमिक कुंजी पूर्णांक है, दूसरा पहले से ही अनुक्रमित है। तीसरी एक अन्य तालिका की प्राथमिक कुंजी के लिए एक विदेशी कुंजी थी। एक स्पष्ट सूचकांक जोड़ने के बिना, लुकअप को यहां कई सेकंड लगे। तालिका से अनुक्रमणिका दिखाना भी इस पर अनुक्रमणिका नहीं दिखाता है।
एबियस एक्स

@AbiusX 5.1 शायद बहुत पुराना है, नीचे देखें MrAlexander का जवाब।
e2-e4

131

जाहिरा तौर पर एक सूचकांक स्वचालित रूप से बनाया जाता है जैसा कि लिंक रॉबर्ट में पोस्ट किया गया है

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

InnoDB और पूर्व प्रमुख बाधाएं


9
+1 के रूप में चयनित एक से बेहतर उत्तर डॉक्स से प्रमाण प्रदान करता है
Gaz_Edge

6
उद्धृत पाठ अब MySQL डॉक्स में शामिल नहीं होता है, यह स्पष्ट नहीं करता है कि यह अभी भी सही है या नहीं।
कोर्टनी माइल्स

7
@ user2045006 आप डॉक 5.0 का उल्लेख कर सकते हैं और साथ ही उद्धृत उद्धरण के लिए डॉक 5.6
sactiw

1
वर्तमान डॉक्स में, पाठ में बस थोड़ा सा बदलाव है (मुझे लगता है कि इसका अर्थ समान है):InnoDB permits a foreign key to reference any index column or group of columns. However, in the referenced table, there must be an index where the referenced columns are the first columns in the same order.
लुकास बस्केरोटो

20

4
यह उत्तर इस बात का एक बड़ा उदाहरण है कि एक उत्तर को कभी भी एक संभावित उत्तर के लिंक से क्यों नहीं जोड़ा जाना चाहिए। इस समय, लिंक किया गया पृष्ठ प्रश्न का उत्तर नहीं देता है।
माइक

1
कृपया केवल एक लिंक पोस्ट करने के बजाय उत्तर में सभी जानकारी जोड़ें
निको हासे

11

यदि आप ALTER TABLE (क्रिएट टेबल के बजाय) करते हैं, तो आपको इंडेक्स अपने आप नहीं मिलता है, कम से कम डॉक्स के अनुसार (लिंक 5.1 के लिए है, लेकिन यह 5.5 के लिए समान है):

[...] जब आप ALTER TABLE का उपयोग करके किसी विदेशी कुंजी बाधा को जोड़ते हैं, तो पहले आवश्यक अनुक्रमित बनाना याद रखें।


2
मैंने MySQL 5.6 और MariaDB 10 और ALTER TABLE पर एक इंडेक्स क्रेट किया। यह दिलचस्प है कि mysqlindexcheck ने उस इंडेक्स को "निरर्थक इंडेक्स" के रूप में रिपोर्ट किया। मैंने इसे गिराने की कोशिश की, लेकिन मुझे निम्न त्रुटि मिली: "ERROR 1553 (HY000): एक इंडेक्स की जरूरत नहीं है 'index_name': एक विदेशी कुंजी बाधा में"। इसलिए, उस सूचकांक को छोड़ना और विदेशी कुंजी को रखना संभव नहीं है।
सिप्रियन स्टोइका

आप अपने उत्तर को संशोधित करना चाह सकते हैं। यदि कोई पहले से मौजूद नहीं है, तो MySQL हमेशा विदेशी कुंजी जांच को तेज करने के लिए एक इंडेक्स बनाता है । डॉक्स आपको यह बताने की कोशिश कर रहे हैं कि विदेशी प्रमुख बाधाओं से पहले इंडेक्स बनाने से चीजें थोड़ी बढ़ सकती हैं। उदाहरण के लिए, एक कंपोजिट कुंजी इंडेक्स जो विदेशी कुंजी जांच के लिए एक इंडेक्स के रूप में काम कर सकता है, का उपयोग ऑटो-जनरेटिंग इंडेक्स के बजाय ऑटो-इंडेक्स द्वारा किया जा सकता है।
15

7

उन लोगों के लिए जो 5.7 डॉक्स से उद्धरण ढूंढ रहे हैं :

MySQL को विदेशी कुंजियों और संदर्भित कुंजियों पर अनुक्रमित करने की आवश्यकता होती है, ताकि विदेशी कुंजी चेक तेज़ हो सकें और टेबल स्कैन की आवश्यकता न हो। संदर्भित तालिका में, एक सूचकांक होना चाहिए जहां विदेशी कुंजी कॉलम को उसी क्रम में पहले कॉलम के रूप में सूचीबद्ध किया गया है। इस तरह के सूचकांक को संदर्भित तालिका पर स्वचालित रूप से बनाया जाता है यदि यह मौजूद नहीं है। यह सूचकांक बाद में चुपचाप गिरा दिया जा सकता है, यदि आप एक और सूचकांक बनाते हैं जिसका उपयोग विदेशी कुंजी बाधा को लागू करने के लिए किया जा सकता है। index_name, यदि दिया गया है, जैसा कि पहले वर्णित है।


4

जैसा कि कहा गया है कि यह InnoDB के लिए है। पहले मुझे लगा कि यह बहुत अजीब है (कई अन्य विशेष रूप से MS SQL और DB2) नहीं है। टेबलस्पेस स्कैन केवल इंडेक्स स्कैन की तुलना में बेहतर होते हैं जब बहुत कम तालिका पंक्तियाँ होती हैं - इसलिए अधिकांश मामलों के लिए एक विदेशी कुंजी अनुक्रमित होना चाहेगी। तब यह मुझे हिट करता है - इसका मतलब यह नहीं है कि इसे अकेले (एक कॉलम) इंडेक्स होना चाहिए - जहां यह MySQL के स्वचालित एफके इंडेक्स में है। तो, हो सकता है कि यही कारण है कि MS SQL, DB2 (Oracle मुझे यकीन नहीं है) आदि इसे DBA तक छोड़ देते हैं; बड़े तालिकाओं पर सभी एकाधिक अनुक्रमों के बाद प्रदर्शन और स्थान के साथ समस्याएँ हो सकती हैं।


आप समग्र कुंजी अनुक्रमित के बारे में एक अच्छा बिंदु लाते हैं; हालाँकि, MySQL स्वतः उत्पन्न / चुपचाप एक स्वत: जनरेट किए गए एकल कुंजी इंडेक्स को छोड़ देगा यदि एक नया बनाया गया कंपोजिट कुंजी इंडेक्स विदेशी कुंजी चेक को तेज़ी से बनाने के दायित्व को पूरा करता है। सच कहूं तो, मुझे नहीं पता कि एमएस एसक्यूएल, डीबी 2 और अन्य ऐसा क्यों करते हैं। उनके पास बहाना थोड़े ही है। मैं उपयोग के मामले के बारे में नहीं सोच सकता, जहां विदेशी कुंजी पर एक ऑटो-जेनरेट किया गया इंडेक्स हानिकारक होगा।
बीएमनर

2

हाँ, Innodbयह प्रदान करें। आप FOREIGN KEYक्लॉज़ के बाद एक विदेशी कुंजी नाम रख सकते हैं या MySQL को आपके लिए एक नाम बनाने के लिए छोड़ सकते हैं। MySQL स्वचालित रूप से foreign_key_nameनाम के साथ एक इंडेक्स बनाता है ।

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

0

हां, जब आप एक ऐसी मेज बनाते हैं जिसमें किसी दूसरे के पास एक विदेशी कुंजी होती है, तो माइकेल इंडेक्स विदेशी कुंजी स्वचालित रूप से बन जाती है।


-2

सूचकांक कुंजी को स्वचालित रूप से उपयोग करना संभव नहीं है

ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)

उस तालिका का नाम जो आपने उदाहरण के लिए बनाई गई तस्वीरों और उदाहरण के लिए FOREIGN KEY के लिए बनाई है photograph_id। कोड इस तरह होना चाहिए

ALTER TABLE photographs ADD INDEX (photograph_id);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.