जवाबों:
हां, लेकिन केवल पर InnoDB। इनोडब वर्तमान में एकमात्र भेज दिया गया तालिका प्रारूप है जिसमें विदेशी कुंजियों को लागू किया गया है।
जाहिरा तौर पर एक सूचकांक स्वचालित रूप से बनाया जाता है जैसा कि लिंक रॉबर्ट में पोस्ट किया गया है ।
InnoDB को विदेशी कुंजियों और संदर्भित कुंजियों पर अनुक्रमित करने की आवश्यकता होती है ताकि विदेशी कुंजी जांच तेज़ हो सके और टेबल स्कैन की आवश्यकता न हो। संदर्भित तालिका में, एक सूचकांक होना चाहिए जहां विदेशी कुंजी कॉलम को उसी क्रम में पहले कॉलम के रूप में सूचीबद्ध किया गया है। इस तरह के सूचकांक को संदर्भित तालिका पर स्वचालित रूप से बनाया जाता है यदि यह मौजूद नहीं है। (यह कुछ पुराने संस्करणों के विपरीत है, जिसमें इंडेक्स को स्पष्ट रूप से बनाया जाना था या विदेशी प्रमुख बाधाओं का निर्माण विफल होगा।) index_name, यदि दिया गया है, तो पहले वर्णित के रूप में उपयोग किया जाता है।
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.
यदि आप ALTER TABLE (क्रिएट टेबल के बजाय) करते हैं, तो आपको इंडेक्स अपने आप नहीं मिलता है, कम से कम डॉक्स के अनुसार (लिंक 5.1 के लिए है, लेकिन यह 5.5 के लिए समान है):
[...] जब आप ALTER TABLE का उपयोग करके किसी विदेशी कुंजी बाधा को जोड़ते हैं, तो पहले आवश्यक अनुक्रमित बनाना याद रखें।
उन लोगों के लिए जो 5.7
डॉक्स से उद्धरण ढूंढ रहे हैं :
MySQL को विदेशी कुंजियों और संदर्भित कुंजियों पर अनुक्रमित करने की आवश्यकता होती है, ताकि विदेशी कुंजी चेक तेज़ हो सकें और टेबल स्कैन की आवश्यकता न हो। संदर्भित तालिका में, एक सूचकांक होना चाहिए जहां विदेशी कुंजी कॉलम को उसी क्रम में पहले कॉलम के रूप में सूचीबद्ध किया गया है। इस तरह के सूचकांक को संदर्भित तालिका पर स्वचालित रूप से बनाया जाता है यदि यह मौजूद नहीं है। यह सूचकांक बाद में चुपचाप गिरा दिया जा सकता है, यदि आप एक और सूचकांक बनाते हैं जिसका उपयोग विदेशी कुंजी बाधा को लागू करने के लिए किया जा सकता है। index_name, यदि दिया गया है, जैसा कि पहले वर्णित है।
जैसा कि कहा गया है कि यह InnoDB के लिए है। पहले मुझे लगा कि यह बहुत अजीब है (कई अन्य विशेष रूप से MS SQL और DB2) नहीं है। टेबलस्पेस स्कैन केवल इंडेक्स स्कैन की तुलना में बेहतर होते हैं जब बहुत कम तालिका पंक्तियाँ होती हैं - इसलिए अधिकांश मामलों के लिए एक विदेशी कुंजी अनुक्रमित होना चाहेगी। तब यह मुझे हिट करता है - इसका मतलब यह नहीं है कि इसे अकेले (एक कॉलम) इंडेक्स होना चाहिए - जहां यह MySQL के स्वचालित एफके इंडेक्स में है। तो, हो सकता है कि यही कारण है कि MS SQL, DB2 (Oracle मुझे यकीन नहीं है) आदि इसे DBA तक छोड़ देते हैं; बड़े तालिकाओं पर सभी एकाधिक अनुक्रमों के बाद प्रदर्शन और स्थान के साथ समस्याएँ हो सकती हैं।
हाँ, 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
सूचकांक कुंजी को स्वचालित रूप से उपयोग करना संभव नहीं है
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
उस तालिका का नाम जो आपने उदाहरण के लिए बनाई गई तस्वीरों और उदाहरण के लिए FOREIGN KEY के लिए बनाई है photograph_id
। कोड इस तरह होना चाहिए
ALTER TABLE photographs ADD INDEX (photograph_id);