การทำให้ฟิลด์เป็นเอกเทศทำให้เป็นดัชนีหรือไม่?


10

หากฉันสร้างuniqueข้อ จำกัด ในฟิลด์ฉันต้องสร้างดัชนีบนฟิลด์นั้นเพื่อให้ได้เวลาแทรกที่ปรับขนาดได้หรือไม่ หรือจะทำเพื่อฉัน (แม้ว่าดัชนีที่ใช้ไม่สามารถเข้าถึงได้แบบสาธารณะ)

โดยเฉพาะฉันทำงานกับ Apache Derby สำหรับการสร้างต้นแบบแม้ว่าฉันอาจจะย้ายไปยัง MySQL ในอนาคตอันใกล้ ฉันก็หวังว่าอาจมีบางอย่างในมาตรฐาน SQL ที่บอกอะไรบางอย่างเกี่ยวกับเรื่องนี้

ฉันไม่จำเป็นต้องค้นหาตามฟิลด์นี้ดังนั้นฉันจึงไม่ต้องการสร้างดัชนีที่ไร้ประโยชน์ แต่ฉันอยากจะมีดัชนีที่ไร้ประโยชน์มากกว่ามีO(n)เวลาแทรก


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

@Marian ขอบคุณสำหรับลิงค์นั้น มันลึกซึ้งมาก
corsiKa

คำตอบ:


2

--EDIT--

คำตอบเดิมของฉัน (ด้านล่าง) อาจไม่เป็นประโยชน์กับคุณเลยเพราะไม่ได้ตอบคำถามuniqueข้อ จำกัด ดังที่คนอื่น ๆ กล่าวว่าข้อ จำกัด เหล่านี้มักจะนำไปใช้กับดัชนีที่ไม่ซ้ำกันโดยนัย ในกรณีพิเศษสิ่งนี้อาจไม่เป็นจริง (เช่นdisable novalidateสำหรับ Oracle)

คำถามอาจเป็นไปได้ไหมที่จะใช้ความเป็นเอกลักษณ์โดยไม่มีดัชนี? โดยทั่วไปการพูดคำตอบนั้นไม่ใช่ในบางกรณีClustered Indexจะหมายความว่าดัชนีและตารางเป็นวัตถุเดียวกัน

--END แก้ไข -

คุณพูดว่า "ฉันควรจะมีดัชนีที่ไร้ประโยชน์มากกว่ามีเวลาแทรก O (n)" แต่ในฐานข้อมูลทั่วไปไม่มีเวลาแทรก O (n) มีสองกรณีที่ควรพิจารณา:

  1. ตารางปกติที่มีหรือไม่มีดัชนี:

    แถวใหม่จะถูกเททิ้งที่ด้านบนของฮีป RDBMS อาจดูเพียง1บล็อกเท่านั้นไม่ใช่แค่ O (1) แต่เล็กมาก O (1)

    หากตารางมีดัชนีตัวชี้ไปยังแถวจะถูกเพิ่มลงในแต่ละรายการ โดยปกติจะเป็นการดำเนินการ O (บันทึก (n))

  2. ตารางที่มีการจัดกลุ่มบางอย่างเกิดขึ้นเช่นIndex Organized Tableหรือคลัสเตอร์สำหรับ Oracle หรือClustered Indexสำหรับ SQL Server และอื่น ๆ :

    แถวใหม่จะถูกแทรกลงในบล็อกเฉพาะซึ่งอาจทำให้บล็อกแยกหรือล้น แต่สิ่งที่เกิดขึ้นมันยังคงเป็น O (log (n)) หรือดีกว่าเกิดจาก b-tree หรือโครงสร้างที่คล้ายกันที่ใช้ในการค้นหาบล็อก


แต่ความเป็นเอกลักษณ์ที่ไม่มีดัชนีจะเป็นO(n)เพราะคุณต้องตรวจสอบตารางทั้งหมด นั่นคือสิ่งที่ฉันพยายามหลีกเลี่ยง
corsiKa

นี่เป็นคำตอบที่ดีที่สุดสำหรับคำถามนี้ !!! +1
RolandoMySQLDBA

@ เคล็ดลับ - ใช่ฉันเข้าใจผิดในตอนแรก ดัชนีคือราคาที่คุณจ่ายสำหรับข้อ จำกัด ที่ไม่ซ้ำใครที่ฉันกลัว คุณสามารถใช้ดัชนีแบบกลุ่มในกรณีของคุณได้หรือไม่?
แจ็คบอกว่าลอง topanswers.xyz

1
@ JackPDougless ฉันสามารถใช้ "index" มาตรฐานและรับO(lg n)เวลาแทรก นั่นไม่ใช่ปัญหา. คำถามของฉันคือระบบโดยรู้ว่าคุณต้องการดัชนีนั้นเพื่อให้ได้เวลาแทรกที่เหมาะสมสร้างดัชนีสำหรับฉัน
corsiKa

2

Primary KEY> = UNIQUE> = INDEX == KEY

ข้อมูล InnoDB นั้นจัดทำโดย PK MyISAM PK ทำหน้าที่เหมือนกับ UNIQUE

INSERT จะต้องเพิ่ม "row" ให้กับดัชนีแต่ละรายการ (ทุกชนิด) ที่คุณมี ใช้เวลาพอสมควร (โดยปกติจะใช้เวลาไม่นานพอ) ดัชนีทั้งหมดจะถูกจัดเก็บในรูปแบบ BTree MyISAM BTree บล็อคคือ 1KB; InnoDB ใช้ 16KB

การแทรกเข้าไปใน InnoDB จะอัพเดต PK และข้อมูลพร้อมกัน

การแทรกลงใน MyISAM มักจะ "ผนวก" ข้อมูลลงใน. MYD แยกจากกันมันจะเพิ่มแถวใน PK (ถ้ามี)

INSERT จะต้องตรวจสอบก่อนว่าไม่มีคีย์ที่ซ้ำกันสำหรับคีย์หลักหรือ UNIQUE ใด ๆ สิ่งนี้ทำได้โดยใช้ดัชนี ดังนั้นทำไม UNIQUE และ FOREIGN KEY CONSTRAINT จึงสร้างดัชนี นี่คือ O (logN) แต่โดยปกติจะเป็น CPU ไม่ใช่ I / O เพราะหากการแคชมีประสิทธิภาพ


คุณมีการอ้างอิงในข้อมูลจำเพาะของ InnoDB ที่ระบุว่าUNIQUEข้อ จำกัด จะสร้างดัชนีโดยที่ผู้ใช้ไม่ได้ระบุไว้หรือไม่
corsiKa

อืม ... ไม่ได้ประสบการณ์เพียงปีเดียว
Rick James

และนี่คือวิธีในการทดสอบ ... สร้างตารางโดยไม่มีดัชนีรองใด ๆ ทำสถานะตารางแสดง - Index_length จะเป็น 0 จากนั้นเพิ่มดัชนีที่ไม่ซ้ำกัน สถานะตารางจะแสดงบางสิ่งบางอย่าง (อาจต้องใส่ข้อมูลจำนวนเล็กน้อยในตาราง)
Rick James

1

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

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

คุณอาจไม่ต้องค้นหาในฟิลด์นี้ แต่ MySQL จะต้องเป็นเส้นทางในการกำหนดความถูกต้องของคีย์และกำหนดวิธีดำเนินการเกี่ยวกับการลบ CASCADE และการดำเนินการ CASCADE ที่อัปเดต

ดัชนี UNIQUE รับประกันความเป็นเอกลักษณ์ของสิ่งอันดับ (ซิงเกิลตัน, คู่, สามเท่า, ... , n-tuples และอื่น ๆ ) ในทุกแถวในตาราง

มันเป็นดุลยพินิจของคุณที่จะลบดัชนีที่ซ้ำกันดังกล่าวหากคุณไม่ทำลายกรอบความคิดที่ จำกัด ที่คุณต้องการให้ตาราง


1
นี่ไม่ตอบคำถามของฉัน คำถามของฉันเกี่ยวข้องกับเวลาแทรก หากคุณมีข้อ จำกัด ที่ไม่ซ้ำกันระบบจะต้องตรวจสอบความไม่ซ้ำกันของเขตข้อมูลก่อนที่จะแทรก - หากไม่มีดัชนีในเขตข้อมูลมันจะต้องค้นหาทั้งตาราง ( O(n)) หากมีดัชนีการค้นหาจะเร็วขึ้นมาก (อาจO(lg n)) นั่นคือปัญหาของฉัน ฉันตระหนักถึงกลไกการอ้างอิงที่สมบูรณ์ฉันกังวลเฉพาะ (สำหรับจุดประสงค์ของคำถามนี้) เกี่ยวกับประสิทธิภาพ
corsiKa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.