MySQL สร้างดัชนีคอลัมน์คีย์ต่างประเทศโดยอัตโนมัติหรือไม่?


คำตอบ:


229

ใช่ แต่เพียงเปิด . ปัจจุบัน Innodb เป็นรูปแบบตารางที่จัดส่งเท่านั้นที่มีการใช้งาน Foreign Key


1
คุณมีเหตุผลใดที่เชื่อว่า MySQL จะอนุญาตให้ใช้คีย์ต่างประเทศในคอลัมน์ที่ไม่ได้จัดทำดัชนีสำหรับประเภทตารางอื่น ๆ ได้หรือไม่?
Robert Gamble

ฉันตอบไม่ได้จริงๆ คุณอาจต้องการค้นหาเอนจิ้นการจัดเก็บข้อมูลของ Maria และ Falcon ที่จะวางจำหน่ายใน MySQL 6.0 และดูว่าพวกเขาสนับสนุนคีย์ต่างประเทศในคอลัมน์ที่ไม่ได้จัดทำดัชนีหรือไม่
Grant Limberg

เห็นได้ชัดว่านี่ไม่เป็นความจริง ฉันมีตารางขนาดใหญ่ (1 ล้านบันทึก) และนับ (*) โดยที่ fkey =? จะใช้เวลา 15 วินาที เพิ่มดัชนีในคอลัมน์ fkey และทุกอย่างอยู่ในเวลาไม่กี่วินาที
AbiusX

การทดลองเดียวกันกับตารางอื่นและบันทึก 10 ล้านรายการ นี่คือ ofc MySQL 5.1 InnoDB ตารางมีสามฟิลด์หนึ่งฟิลด์เป็นจำนวนเต็มคีย์หลักอีกอันหนึ่งถูกทำดัชนีแล้ว ที่สามคือกุญแจต่างประเทศเพื่อคีย์หลักของตารางอื่น การค้นหาจะใช้เวลาหลายวินาทีโดยไม่เพิ่มดัชนีที่ชัดเจน แสดงดัชนีจากตารางยังไม่แสดงดัชนีของมัน
AbiusX

@AbiusX 5.1 อาจเก่าเกินไปดูคำตอบของ MrAlexander ด้านล่าง
e2-e4

131

เห็นได้ชัดว่าดัชนีจะถูกสร้างขึ้นโดยอัตโนมัติตามที่ระบุในการเชื่อมโยงโรเบิร์ตได้โพสต์

InnoDB ต้องการดัชนีในคีย์ต่างประเทศและรหัสอ้างอิงเพื่อให้การตรวจสอบคีย์ต่างประเทศนั้นรวดเร็วและไม่ต้องใช้การสแกนตาราง ในตารางอ้างอิงจะต้องมีดัชนีที่คอลัมน์คีย์ต่างประเทศจะแสดงรายการเป็นคอลัมน์แรกตามลำดับเดียวกัน ดัชนีดังกล่าวจะถูกสร้างขึ้นในตารางอ้างอิงโดยอัตโนมัติหากไม่มีอยู่ (ซึ่งตรงกันข้ามกับเวอร์ชันเก่าบางรุ่นซึ่งต้องสร้างดัชนีอย่างชัดเจนหรือการสร้างข้อ จำกัด ของคีย์ต่างประเทศจะล้มเหลว) index_name ถ้ากำหนดจะใช้ตามที่อธิบายไว้ก่อนหน้านี้

InnoDB และข้อ จำกัด ที่สำคัญต่างประเทศ


9
+1 คำตอบที่ดีกว่าคำตอบที่เลือกซึ่งแสดงหลักฐานจากเอกสาร
Gaz_Edge

6
ข้อความที่ยกมานั้นดูเหมือนจะไม่รวมอยู่ในเอกสาร MySQL อีกต่อไปทำให้ไม่ชัดเจนว่าสิ่งนี้ยังคงเป็นจริงหรือไม่
Courtney Miles

7
@ user2045006 คุณสามารถอ้างถึงdoc 5.0และdoc 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.
Lucas Basquerotto

20

ใช่เห็นข้อ จำกัด InnoDB และต่างประเทศที่สำคัญ


4
คำตอบนี้เป็นตัวอย่างที่ดีว่าทำไมคำตอบไม่ควรมีเพียงลิงค์ไปยังคำตอบที่เป็นไปได้ ในขณะนี้หน้าเชื่อมโยงไม่สามารถตอบคำถามได้เลย
Mike

1
โปรดเพิ่มข้อมูลทั้งหมดลงในคำตอบแทนที่จะโพสต์ลิงก์เท่านั้น
Nico Haase

11

คุณไม่ได้รับดัชนีโดยอัตโนมัติหากคุณทำ ALTER TABLE (แทนที่จะสร้าง CREATE TABLE) อย่างน้อยตามเอกสาร (ลิงก์สำหรับ 5.1 แต่เหมือนกันกับ 5.5):

[... ] เมื่อคุณเพิ่มข้อ จำกัด foreign key ให้กับตารางโดยใช้ ALTER TABLE อย่าลืมสร้างดัชนีที่จำเป็นก่อน


2
ฉันยังลองบน MySQL 5.6 และ MariaDB 10 และ ALTER TABLE crated ดัชนี เป็นที่น่าสนใจที่ mysqlindexcheck รายงานว่าดัชนีนั้นเป็น "ดัชนีซ้ำซ้อน" ฉันพยายามที่จะวาง แต่ฉันได้รับข้อผิดพลาดต่อไปนี้: "ข้อผิดพลาด 1553 (HY000): ไม่สามารถวางดัชนี 'index_name': จำเป็นในข้อ จำกัด ที่สำคัญต่างประเทศ" ดังนั้นจึงเป็นไปไม่ได้ที่จะดร็อปดัชนีนั้นและคงคีย์ต่างประเทศไว้
Ciprian Stoica

คุณอาจต้องการแก้ไขคำตอบของคุณ MySQL เสมอสร้างดัชนีเพื่อเพิ่มความเร็วในการตรวจสอบที่สำคัญต่างประเทศหากไม่อยู่แล้ว เอกสารกำลังพยายามบอกคุณว่าการสร้างดัชนีก่อนที่ข้อ จำกัด ของรหัสต่างประเทศอาจทำให้สิ่งต่าง ๆ เร็วขึ้น ตัวอย่างเช่นดัชนีคีย์ผสมที่สามารถใช้เป็นดัชนีสำหรับการตรวจสอบคีย์ต่างประเทศสามารถใช้งานได้โดย InnoDB แทนที่จะสร้างดัชนีซ้ำซ้อนโดยอัตโนมัติ
BMiner

7

สำหรับผู้ที่กำลังมองหาคำพูดจาก5.7 เอกสาร :

MySQL ต้องการดัชนีในคีย์ต่างประเทศและรหัสอ้างอิงเพื่อให้การตรวจสอบคีย์ต่างประเทศนั้นรวดเร็วและไม่ต้องใช้การสแกนตาราง ในตารางอ้างอิงจะต้องมีดัชนีที่คอลัมน์คีย์ต่างประเทศจะแสดงรายการเป็นคอลัมน์แรกในลำดับเดียวกัน ดัชนีดังกล่าวจะถูกสร้างขึ้นในตารางอ้างอิงโดยอัตโนมัติหากไม่มีอยู่ ดัชนีนี้อาจถูกลดลงอย่างเงียบ ๆ ในภายหลังหากคุณสร้างดัชนีอื่นที่สามารถใช้เพื่อบังคับใช้ข้อ จำกัด foreign key index_name ถ้ากำหนดจะถูกใช้ตามที่อธิบายไว้ก่อนหน้านี้


4

ตามที่ระบุไว้สำหรับ InnoDB ตอนแรกฉันคิดว่ามันแปลกที่คนอื่น ๆ (โดยเฉพาะ MS SQL และ DB2) ไม่ได้ การสแกน TableSpace นั้นดีกว่าการสแกนดัชนีเมื่อมีแถวของตารางน้อยมาก - ดังนั้นสำหรับกรณีส่วนใหญ่คีย์ต่างประเทศจะต้องการทำดัชนี ถ้าอย่างนั้นฉันจะตี - นี่ไม่ได้หมายความว่ามันจะต้องเป็นดัชนีแบบสแตนด์อโลน (หนึ่งคอลัมน์) - มันอยู่ที่ไหนในดัชนี FK อัตโนมัติของ MySQL ดังนั้นอาจเป็นเพราะ MS SQL, DB2 (Oracle ฉันไม่แน่ใจ) และปล่อยให้ DBA; หลังจากดัชนีหลายรายการทั้งหมดในตารางขนาดใหญ่อาจทำให้เกิดปัญหากับประสิทธิภาพและพื้นที่


คุณได้จุดที่ดีเกี่ยวกับดัชนีคีย์ผสม อย่างไรก็ตาม MySQL จะทำการลบดัชนีคีย์เดี่ยวที่สร้างขึ้นอัตโนมัติโดยอัตโนมัติหากดัชนีคีย์คอมโพสิตที่สร้างขึ้นใหม่นั้นเป็นไปตามภาระหน้าที่ในการตรวจสอบคีย์ต่างประเทศอย่างรวดเร็ว บอกตามตรงฉันไม่รู้ว่าทำไม MS SQL, DB2 และอื่น ๆ ไม่ทำเช่นนี้ พวกเขามีข้อแก้ตัวเล็กน้อย ฉันไม่สามารถนึกถึงกรณีการใช้งานที่ดัชนีที่สร้างขึ้นโดยอัตโนมัติในคีย์ต่างประเทศอาจเป็นอันตรายได้
BMiner

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

ใช่ Mysql ดัชนีคีย์ต่างประเทศโดยอัตโนมัติเมื่อคุณสร้างตารางที่มีรหัสต่างประเทศอื่น


-2

ไม่สามารถรับรหัสดัชนีได้โดยอัตโนมัติ

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

ชื่อของตารางที่คุณได้สร้างตัวอย่างเช่นรูปถ่ายและต่างประเทศ KEY photograph_idตัวอย่างเช่น รหัสควรเป็นเช่นนี้

ALTER TABLE photographs ADD INDEX (photograph_id);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.