2008-11-20 6 views

उत्तर

157

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

+0

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

+0

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

+0

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

90

स्पष्ट रूप से एक सूचकांक स्वचालित रूप से the link robert has posted में निर्दिष्ट के रूप में बनाया गया है।

InnoDB requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. (This is in contrast to some older versions, in which indexes had to be created explicitly or the creation of foreign key constraints would fail.) index_name, if given, is used as described previously.

InnoDB and FOREIGN KEY Constraints

+6

डॉक्स –

+4

से सबूत प्रदान करने के रूप में चयनित एक से बेहतर जवाब +1 +1 उद्धृत पाठ अब MySQL दस्तावेज़ों में शामिल नहीं दिखता है, यह स्पष्ट नहीं है कि यह अभी भी सही है या नहीं। – user2045006

+5

@ user2045006 आप [डॉक्टर 5.0] (http://dev.mysql.com/doc/refman/5] का उल्लेख कर सकते हैं।0/en/create-table-foreign-keys.html) साथ ही [डॉक्टर 5.6] (http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html) के लिए सटीक उद्धृत पाठ – sactiw

4

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

9

आप सूचकांक स्वचालित रूप से यदि आप एक ALTER तालिका (के बजाय टेबल बनाएं) करना नहीं मिलता है, कम से कम the docs के अनुसार (लिंक 5.1 के लिए है, लेकिन यह 5.5 के लिए ही है):

[...] When you add a foreign key constraint to a table using ALTER TABLE, remember to create the required indexes first.

+9

मैंने _5.5.31_ और 'वैकल्पिक तालिका' पर एक अनुक्रमणिका बनाई है। –

+2

मैंने माईएसQL 5.6 और मारियाडीबी 10 और अल्टर टेबल पर भी एक इंडेक्स को क्रेट किया। यह दिलचस्प है कि mysqlindexcheck ने सूचकांक को "अनावश्यक अनुक्रमणिका" के रूप में बताया। मैंने इसे छोड़ने की कोशिश की लेकिन मुझे निम्न त्रुटि मिली: "त्रुटि 1553 (एचवाई000): इंडेक्स 'index_name' को छोड़ नहीं सकता: एक विदेशी कुंजी बाधा में आवश्यक"। इसलिए, उस इंडेक्स को छोड़ना और विदेशी कुंजी रखना संभव नहीं है। –

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 
-2

यह सूचकांक कुंजी स्वचालित रूप से तालिका आप उदाहरण के फोटो और उदाहरण photograph_id के लिए विदेशी कुंजी के लिए बनाया है, जिनमें से उपयोग करें

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

नाम पाने के लिए संभव नहीं है। कोड इस

ALTER TABLE photographs ADD INDEX (photograph_id); 
3

जो 5.7docs से बोली के लिए देख रहे हैं उन लोगों के लिए की तरह होना चाहिए:

MySQL requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. This index might be silently dropped later, if you create another index that can be used to enforce the foreign key constraint. index_name, if given, is used as described previously.

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