สร้างดัชนีฐานข้อมูล


12

ฉันไม่คุ้นเคยกับฐานข้อมูลและตอนนี้ฉันพยายามเข้าใจกลไกการจัดทำดัชนี

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

ฉันไม่แน่ใจเกี่ยวกับ RDBMS แต่สำหรับร้านค้าสามแห่งคุณสามารถกำหนดดัชนีได้มากกว่าหนึ่งดัชนีทำให้ร้านค้าเลือกดัชนีที่ดีที่สุดสำหรับแต่ละแบบสอบถาม (หวังว่าฉันเข้าใจถูกต้อง) โดยปกติแล้วคำถามต่อไปนี้จะปรากฏขึ้น:

เหตุใดฉันจึงไม่ควรเพิ่มดัชนีที่เป็นไปได้ทั้งหมดลงในร้านค้าสามแห่งและขยายไปยัง RDBMS ทำไมไม่สร้างดัชนีในแต่ละคอลัมน์ (สมมติว่าฉันไม่ขี้เกียจเกินไป)

คำตอบ:


25

เพราะโดยหลักแล้วดัชนีคือตารางเสริมโดยที่คีย์หลักคือฟิลด์ที่คุณกำลังจัดทำดัชนีและเนื้อหาเดียวคือคีย์หลักของตารางหลักของคุณ ดังนั้นทุกการอัพเดทจะต้องทำซ้ำในทุกดัชนีที่ใช้ฟิลด์ที่คุณอัพเดท

สิ่งนี้เห็นได้อย่างชัดเจนในส่วนแทรก ลองนึกภาพว่าทุกเม็ดที่คุณทำในตารางจะต้องทำซ้ำบนโต๊ะอื่น 20 ตาราง มันจะช้าลงอย่างเจ็บปวด

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


2

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

ทำไมคุณต้องการสร้างและจัดเก็บดัชนีที่คุณไม่เคยใช้


มันเป็นคำถามเชิงทฤษฎีอย่างหมดจด ("จะเกิดอะไรขึ้นถ้า / ทำไมไม่")
Dragos

@Dragos ฉันคิดว่าคำตอบสำหรับคำถามเหล่านั้นเห็นได้ชัดจากโพสต์ของฉัน: ถ้าคุณทำทุกการเขียนจะช้าลงมากและทุกระเบียนจะเสียความจุของดิสก์จำนวนมาก ทำไมจะไม่ล่ะ? เนื่องจากพลังงานซีพียูและการจัดเก็บดิสก์มีราคาแพง
MatějZábský

2

วางดัชนีเฉพาะเมื่อจำเป็นเท่านั้น ตามกฎของหัวแม่มือเมื่อฉันพัฒนา schema ของฐานข้อมูลทุกตารางจะได้รับดัชนี PK Primary Key Clustered เพื่อเริ่มต้น นี่จะเป็นตัวระบุเฉพาะสำหรับข้อมูลในตารางนั้น สามารถอยู่ใน 1 คอลัมน์หรือหลาย ๆ

หลังจากนั้นฉันมักจะเพิ่ม Non-Clustered Unique Indexes ในคอลัมน์ (s) ซึ่งฉันต้องการบังคับให้มีเอกลักษณ์

นี่คือสคีมาฐาน เมื่อแอปพลิเคชันได้รับการพัฒนาและพัฒนาจนครบกำหนดเราจะเพิ่มดัชนีตามความจำเป็นโดยคำนึงถึงประสิทธิภาพการทำงานและวิธีที่เราทำการสืบค้นข้อมูล

ทุกดัชนีที่เพิ่มจะเพิ่มระยะห่างที่ใช้และเพิ่มการบำรุงรักษาเพิ่มเติม ดังนั้นเลือกดัชนีของคุณอย่างชาญฉลาด


ในขณะที่อ่านคำตอบของคุณมีคำถามอีกคำถามที่โผล่มาในใจของฉัน: คีย์หลักมักจะจัดทำดัชนีโดยอัตโนมัติหรือฉันต้องระบุตัวเองว่าพวกเขาจะได้รับการจัดทำดัชนี? ตัวอย่างเช่นในฐานข้อมูล MySQL?
Dragos

ใช่คีย์หลักควรสร้างดัชนีคลัสเตอร์โดยอัตโนมัติสำหรับคุณ (SQL Server) คีย์หลักเดียวเท่านั้นจึงมีดัชนีคลัสเตอร์เดียวต่อตาราง MySQL ควรจะคล้ายกัน แต่บางทีผู้เชี่ยวชาญ MySQL สามารถตรวจสอบได้
Jon Raynor

2

ความแข็งแกร่งของดัชนีคือ 1) โครงสร้างข้อมูลที่สามารถค้นหาได้อย่างรวดเร็วและ 2) มีขนาดกะทัดรัดกว่าตารางจริงทำให้ดัชนีสามารถใส่หน่วยความจำได้มากกว่าการจัดเพจลงดิสก์

หากคุณมีดัชนีในทุกคอลัมน์ดัชนีนั้นจะใช้พื้นที่มากกว่าตารางที่แสดง หากฐานข้อมูลใช้ดัชนีทั้งหมดจริง ๆ จะต้องใช้เวลามากขึ้นในการสลับเข้าและออกหน่วยความจำ นอกจากนี้ทุกดัชนีจะต้องมีการปรับปรุงใน inert, update หรือ delete

นอกเหนือจากนั้นดัชนีในคอลัมน์เดียวไม่ได้ดีที่สุดที่คุณสามารถทำได้ ฐานข้อมูลความสัมพันธ์ส่วนใหญ่อนุญาตให้ดัชนีในหลายคอลัมน์และลำดับของคอลัมน์เหล่านี้มีความสำคัญ ตัวอย่างเช่นถ้าฉันต้องการค้นหาฐานข้อมูลสำหรับทุกคนที่ไปหาตู้จากชั้นเรียนระหว่างปี 1980 และ 1984 สิ่งที่ฉันต้องการคือดัชนีบน (โรงเรียน, ชั้นปี) แบบสอบถามจะไม่สามารถใช้ดัชนีที่มีคอลัมน์เดียวกัน แต่กลับด้าน

ดังนั้นในการสร้างทุกดัชนีที่เป็นไปได้มีอย่างน้อย n! วิธีจัดเรียงคอลัมน์ในดัชนี มีเพียง 5 คอลัมน์มี 120 ดัชนีที่เป็นไปได้

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


แต่ในตัวอย่างของคุณมีสองดัชนี: อันหนึ่งในโรงเรียนและอีกอันหนึ่งใน ClassYear มีประโยชน์ในกรณีใด ๆ ?
Dragos

@Dragos แน่นอนพวกเขาสามารถ หากฉันมีข้อสงสัยอื่นที่เกินระดับปี (นักเรียนทุกคนที่ไปโรงเรียนในชั้นเรียนปี 2004) ดัชนีชั้นปีอาจมีประโยชน์ น่าเสียดายที่มีปัจจัยมากมายที่เอ็นจินการสืบค้นใช้เมื่อตัดสินใจว่าจะใช้ดัชนีใดเมื่อใด หากปรากฎว่าครึ่งหนึ่งของคนที่อยู่ในฐานข้อมูลไม่ไปโรงเรียนในปี 2004 จากนั้นฐานข้อมูลก็อาจจะไม่สนใจดัชนีและสแกนมากกว่าทั้งตาราง anyways หากคุณต้องการทำความดีให้เริ่มใช้และอ่านแผนการดำเนินการ
Chris Pitman

สิ่งที่ฉันหมายถึงคือถ้าฉันมีดัชนีแยกกันใน School และ ClssYear พวกเขาจะมีประโยชน์เมื่อค้นหาคนทั้งหมดที่ไปหา Duke จากชั้นเรียนระหว่างปี 1980 และ 1984 หรือไม่
Dragos

@Dragos มันขึ้นอยู่กับเครื่องยนต์ db เฉพาะ ตัวอย่างเช่น Postgres จะใช้สิ่งที่เรียกว่าการสแกนดัชนีบิตแมปเพื่อตัดผลลัพธ์ของดัชนีหลายรายการ มันขึ้นอยู่กับเคียวรีเพื่อตัดสินใจว่าจะใช้ดัชนีใดและสิ่งนี้จะเป็นค่าเฉพาะ db
Chris Pitman

2

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

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

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