foreign key สร้างดัชนีโดยอัตโนมัติหรือไม่


389

ฉันได้รับแจ้งว่าถ้าฉันใส่ foreign key สองตาราง, SQL Server จะสร้างสิ่งที่คล้ายกับดัชนีในตารางลูก ฉันมีเวลายากที่จะเชื่อว่าสิ่งนี้เป็นจริง แต่ไม่สามารถหาได้ว่าเกี่ยวข้องกับสิ่งนี้โดยเฉพาะมากน้อยเพียงใด

เหตุผลที่แท้จริงของฉันในการถามสิ่งนี้คือเพราะเรากำลังเผชิญกับเวลาตอบสนองช้ามากในคำสั่งลบกับตารางที่อาจมี 15 ตารางที่เกี่ยวข้อง ฉันถามคนในฐานข้อมูลของเราและเขาบอกว่าถ้ามีคีย์ต่างประเทศในเขตข้อมูลก็จะทำหน้าที่เหมือนดัชนี ประสบการณ์ของคุณกับสิ่งนี้คืออะไร? ฉันควรเพิ่มดัชนีในเขตข้อมูลคีย์ต่างประเทศทั้งหมดหรือเป็นเพียงค่าใช้จ่ายที่ไม่จำเป็นหรือไม่


ฉันมีความเข้าใจเช่นเดียวกับผู้ชาย DB ของคุณ - ที่จริง FKs สร้างดัชนี
วินนี

9
ไม่ - FK จะไม่สร้างดัชนีโดยอัตโนมัติ มันสมเหตุสมผลแล้วที่จะสร้างมันขึ้นมา แต่มันไม่ได้ทำโดยอัตโนมัติโดย SQL Server
marc_s

47
ไม่โง่ที่จะถามเรื่องนี้เลย!
marc_s

5
หากคุณได้รับการลบช้าและตารางที่คุณกำลังลบจากการอ้างอิงโดยตารางอื่น ๆ คุณอาจจะได้รับการเพิ่มประสิทธิภาพโดยการจัดทำดัชนีคีย์ต่างประเทศในตารางอื่น ๆ เนื่องจากเมื่อ SQL กำลังลบแถวจำเป็นต้องตรวจสอบ Referential Integrity ในแถวนั้น ในการทำเช่นนี้คุณจะต้องตรวจสอบว่าไม่มีแถวอื่นอ้างอิงแถวที่คุณกำลังลบ
Noel Kennedy

3
ฉันว่าคนฐานข้อมูลที่ไม่รู้ว่าจะต้องมีการฝึกอบรมอย่างจริงจัง คนฐานข้อมูลมีความรับผิดชอบในการปฏิบัติงานมันเป็นงานของพวกเขาที่จะรู้ว่าสิ่งเหล่านี้ สิ่งนี้แสดงถึงการไร้ความสามารถขั้นต้น
HLGEM

คำตอบ:


343

foreign key คือข้อ จำกัด ความสัมพันธ์ระหว่างสองตาราง - ซึ่งไม่เกี่ยวข้องกับดัชนีต่อ se

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

ดังนั้นจึงเหมาะสมที่จะทำดัชนีคอลัมน์ใด ๆ ที่เกี่ยวข้องใน FK แต่ FK ต่อ se ไม่ใช่ดัชนี

ดูบทความที่ยอดเยี่ยมของ Kimberly Tripp "SQL Server หยุดวางดัชนีในคอลัมน์ Foreign Key เมื่อใด?" .


อ๋อ ฉันแค่บวกเกี่ยวกับที่ PostgreSQL สร้างดัชนี ฉันค่อนข้างแน่ใจว่า MySQL ทำ การทำให้ดัชนีมีความหมายมากมาย แต่ก็ไม่จำเป็น ท้ายที่สุดแล้วทำไมบางสิ่งบางอย่างอ้างอิงถึงถ้าทุกครั้งที่ฐานข้อมูลไปค้นหามันต้องทำ tablescan?
MBCook

บทความนี้อ้างถึงข้างต้นเป็นชนิดของความสับสนเพราะเซิร์ฟเวอร์ SQL หรือฐานข้อมูลอื่น ๆ ไม่เคยทำให้ดัชนีใน FK
vsingh

7
@ vsingh: นั่นคือสิ่งที่บทความพยายามที่จะถ่ายทอด - มันเป็นความเข้าใจผิดทั่วไปที่ FK สร้างดัชนีโดยอัตโนมัติ - มันไม่ได้ทำอย่างนั้น
marc_s

5
@MBCook ไม่มี PostgreSQL ไม่ได้ (อย่างน้อยใน 9.2 หรือรุ่นใด ๆ ก่อนหน้า) REFERENCESโดยอัตโนมัติสร้างดัชนีในด้านการอ้างอิงของความสัมพันธ์ที่สำคัญต่างประเทศที่กำหนดไว้กับ มันจะสร้างUNIQUEดัชนีสำหรับPRIMARY KEYหรือUNIQUEข้อ จำกัดโดยอัตโนมัติและกำหนดให้มีUNIQUEดัชนีสำหรับการอ้างอิงที่สิ้นสุดของความสัมพันธ์กับคีย์ต่างประเทศ แต่ไม่ได้ทำอะไรโดยอัตโนมัติสำหรับการอ้างอิงแม้ว่าจะเป็นความคิดที่ดีที่จะสร้างมันขึ้นมาเอง ดู stackoverflow.com/questions/970562/…
Craig Ringer

16
ความสับสนอาจเกิดขึ้นเพราะ MySQL InnoDB ทั้งสองต้องการและสร้างดัชนีโดยอัตโนมัติเมื่อคุณเพิ่มคีย์ต่างประเทศ - dev.mysql.com/doc/refman/5.5/en/ …
humbads

42

ว้าวคำตอบอยู่ทั่วแผนที่ ดังนั้นเอกสารกล่าวว่า:

ข้อ จำกัด KEY ต่างประเทศเป็นตัวเลือกสำหรับดัชนีเนื่องจาก:

  • การเปลี่ยนแปลงข้อ จำกัด ของคีย์หลักจะถูกตรวจสอบด้วยข้อ จำกัด ของคีย์ต่างประเทศในตารางที่เกี่ยวข้อง

  • คอลัมน์คีย์ต่างประเทศมักใช้ในเกณฑ์การเข้าร่วมเมื่อข้อมูลจากตารางที่เกี่ยวข้องรวมอยู่ในแบบสอบถามโดยการจับคู่คอลัมน์ในข้อ จำกัด FOREIGN KEY ของตารางหนึ่งกับคอลัมน์หลักหรือคอลัมน์หลักที่ไม่ซ้ำกันในตารางอื่น ดัชนีอนุญาตให้Microsoft® SQL Server ™ 2000 ค้นหาข้อมูลที่เกี่ยวข้องในตารางคีย์ต่างประเทศได้อย่างรวดเร็ว อย่างไรก็ตามการสร้างดัชนีนี้ไม่ใช่ข้อกำหนด ข้อมูลจากสองตารางที่เกี่ยวข้องสามารถรวมกันได้แม้ว่าจะไม่มีการกำหนดข้อ จำกัด ของคีย์หลักหรือคีย์ต่างประเทศระหว่างตาราง แต่ความสัมพันธ์ของคีย์ต่างประเทศระหว่างสองตารางบ่งชี้ว่าทั้งสองตารางได้รับการปรับให้เหมาะสมเพื่อรวมในแบบสอบถามที่ใช้คีย์เป็น เกณฑ์ของมัน

ดังนั้นจึงดูเหมือนว่าค่อนข้างชัดเจน (แม้ว่าเอกสารประกอบจะค่อนข้างสับสน) ซึ่งในความเป็นจริงไม่ได้สร้างดัชนี


5
ตรง - เป็นCANDIDATEสำหรับดัชนี - แต่มันไม่ได้ถูกสร้างเป็นหนึ่งโดยอัตโนมัติ! ค่อนข้างชัดเจนจริง IMHO :-)
marc_s

4
ฉันพบว่าส่วนนี้ยุ่งเหยิง: "ความสัมพันธ์ของคีย์ต่างประเทศระหว่างสองตารางบ่งชี้ว่าทั้งสองตารางได้รับการปรับให้เหมาะสมที่จะรวมในแบบสอบถามที่ใช้คีย์เป็นเกณฑ์" ที่ควรอ่าน "... สองตารางควรได้รับการปรับให้เหมาะสม ... "
Yishai

18

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


"ดัชนีโดยนัย" คืออะไร มันแปลว่าต้นไม้ ab * ไม่ได้สร้างมันขึ้นมาใช่ไหม?
สเตฟานีหน้า

1
@Stephanie Page: เป็นนิพจน์ที่ฉันสร้างขึ้นสำหรับคำตอบนี้เพื่อหมายถึงดัชนีที่สร้างขึ้นโดยอัตโนมัติ หากคุณประกาศคีย์หลักเซิร์ฟเวอร์ SQL จะสร้างและสร้างดัชนีให้โดยอัตโนมัติ แต่ถ้าไม่ใช่คุณจะประกาศคีย์ต่างประเทศ (บางระบบ DB อื่น ๆ ทำได้)
Michael Borgwardt

7

SQL Server สร้างดัชนีอัตโนมัติสำหรับคีย์หลัก แต่ไม่ใช่สำหรับรหัสต่างประเทศ สร้างดัชนีสำหรับ Foreign Keys มันอาจจะคุ้มค่า


6

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

เพื่อตรวจสอบว่ามีคำสั่งซื้อใด ๆ หรือไม่ SQL Server ต้องค้นหาตารางคำสั่งซื้อขนาดใหญ่ ตอนนี้ถ้ามีดัชนีการค้นหาจะเร็ว หากไม่มีการค้นหาจะช้า

ดังนั้นในกรณีนี้การลบแบบช้าสามารถอธิบายได้หากไม่มีดัชนี โดยเฉพาะอย่างยิ่งถ้าเซิร์ฟเวอร์ sql จะต้องค้นหา 15 ตารางขนาดใหญ่โดยไม่มีดัชนี

ป.ล. ถ้ารหัสต่างประเทศมี ON DELETE CASCADE, SQL Server ยังคงต้องค้นหาตารางคำสั่ง แต่เพื่อลบคำสั่งซื้อใด ๆ ที่อ้างอิงถึงลูกค้าที่ถูกลบ


แน่นอน - นั่นคือเหตุผลที่ดัชนีบน FK จะทำให้ความรู้สึกมาก (ส่วนใหญ่ของเวลา)
marc_s

1
เวลาส่วนใหญ่? ดูเหมือนว่านี่เป็นกรณีของการลบจากพาเรนต์ หากส่วนใหญ่เวลาที่คุณลบจากผู้ปกครองฉันเดาว่าเป็นเรื่องจริง
สเตฟานีหน้า

6

แป้นต่างประเทศไม่สร้างดัชนี ข้อ จำกัด ของคีย์สำรอง (UNIQUE) และข้อ จำกัด ของคีย์หลักเท่านั้นที่สร้างดัชนี สิ่งนี้เป็นจริงใน Oracle และ SQL Server


3

ไม่ใช่ความรู้ของฉัน foreign key จะเพิ่มข้อ จำกัด ที่ค่าใน child key นั้นจะแสดงที่ใดที่หนึ่งในคอลัมน์ parent ไม่ได้บอกฐานข้อมูลว่าคีย์ลูกนั้นจำเป็นต้องถูกทำดัชนี จำกัด ด้วย


3

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


3

ใน PostgeSql คุณสามารถตรวจสอบดัชนีของคุณเองได้หากคุณกดปุ่ม \ d tablename

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

ฉันคิดว่าอย่างน้อยตอบคำถามของคุณสำหรับ postgres


ขออภัยฉันไม่ได้สังเกตว่าคำถามเกี่ยวข้องกับ MS SQL Server แต่หลังจากโพสต์คำตอบแล้ว มันอาจจะยังช่วยใครซักคนได้ ...
Gregor

2

ฉันสังเกตเห็นว่า Entity Framework 6.1 ชี้ไปที่ MSSQL จะเพิ่มดัชนีในคีย์ต่างประเทศโดยอัตโนมัติ


ฉันไม่เชื่อว่ามันจะทำอย่างไรถ้าคุณตั้งค่าสถานะคอลัมน์ด้วยตนเองเป็นส่วนหนึ่งของดัชนี (เช่นถ้าคุณกำลังสร้างดัชนีคอมโพสิตเหนือสมาชิกหลาย ๆ คน)
Rowland Shaw

0

InnoDBต้องการดัชนีในคีย์ต่างประเทศและรหัสอ้างอิงเพื่อให้การตรวจสอบคีย์ต่างประเทศนั้นรวดเร็วและไม่ต้องใช้การสแกนตาราง ในตารางอ้างอิงจะต้องมีดัชนีที่คอลัมน์คีย์ต่างประเทศจะแสดงรายการเป็นคอลัมน์แรกในลำดับเดียวกัน

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