ทำไมถึงจำเป็น?
เมื่อข้อมูลถูกเก็บไว้ในอุปกรณ์จัดเก็บข้อมูลบนดิสก์ข้อมูลจะถูกจัดเก็บเป็นบล็อกข้อมูล บล็อกเหล่านี้มีการเข้าถึงอย่างครบถ้วนทำให้พวกเขาดำเนินการเข้าถึงดิสก์อะตอมมิก บล็อกดิสก์มีโครงสร้างในลักษณะเดียวกันกับรายการที่ลิงก์ ทั้งสองมีส่วนสำหรับข้อมูลตัวชี้ไปยังตำแหน่งของโหนดถัดไป (หรือบล็อก) และทั้งสองไม่จำเป็นต้องเก็บไว้อย่างต่อเนื่อง
เนื่องจากความจริงที่ว่าจำนวนเรคคอร์ดสามารถจัดเรียงในฟิลด์เดียวเท่านั้นเราสามารถระบุว่าการค้นหาในฟิลด์ที่ไม่ได้จัดเรียงต้องใช้การค้นหาแบบเชิงเส้นซึ่งต้องใช้การN/2
เข้าถึงแบบบล็อก (โดยเฉลี่ย) ซึ่งN
เป็นจำนวนบล็อกที่ ตารางครอบคลุม หากฟิลด์นั้นเป็นฟิลด์ที่ไม่ใช่คีย์ (เช่นไม่มีรายการที่ไม่ซ้ำ) ดังนั้นพื้นที่ตารางทั้งหมดจะต้องค้นหาที่การN
เข้าถึงบล็อก
อาจใช้การค้นหาแบบไบนารีซึ่งมีการlog2 N
เข้าถึงแบบบล็อก นอกจากนี้เนื่องจากข้อมูลจะถูกจัดเรียงตามเขตข้อมูลที่ไม่ใช่คีย์ส่วนที่เหลือของตารางไม่จำเป็นต้องค้นหาค่าที่ซ้ำกันเมื่อพบค่าที่สูงขึ้น ดังนั้นการเพิ่มประสิทธิภาพจึงเป็นสิ่งสำคัญ
การจัดทำดัชนีคืออะไร?
การจัดทำดัชนีเป็นวิธีการเรียงลำดับของจำนวนระเบียนในหลายเขต การสร้างดัชนีบนเขตข้อมูลในตารางจะสร้างโครงสร้างข้อมูลอื่นที่เก็บค่าเขตข้อมูลและตัวชี้ไปยังระเบียนที่สัมพันธ์กับ โครงสร้างดัชนีนี้จะถูกจัดเรียงแล้วอนุญาตให้ทำการค้นหาแบบไบนารีได้
ข้อเสียของการจัดทำดัชนีคือดัชนีเหล่านี้ต้องการพื้นที่เพิ่มเติมบนดิสก์เนื่องจากดัชนีจะถูกจัดเก็บไว้ในตารางโดยใช้กลไก MyISAM ไฟล์นี้สามารถเข้าถึงขนาด จำกัด ของระบบไฟล์พื้นฐานได้อย่างรวดเร็วหากฟิลด์จำนวนมากในตารางเดียวกันถูกทำดัชนี .
มันทำงานยังไง?
ก่อนอื่นเรามาร่างเค้าร่างตารางฐานข้อมูลตัวอย่าง
ชื่อเขตข้อมูลชนิดข้อมูลขนาดบนดิสก์
id (คีย์หลัก) INT 4 ไบต์ที่ไม่ได้ลงนาม
firstName Char (50) 50 ไบต์
นามสกุลชื่อ Char (50) 50 ไบต์
emailAddress Char (100) 100 ไบต์
หมายเหตุ : char ถูกใช้แทน varchar เพื่ออนุญาตขนาดที่ถูกต้องกับค่าดิสก์ ฐานข้อมูลตัวอย่างนี้มีห้าล้านแถวและไม่ได้ทำดัชนี ตอนนี้ประสิทธิภาพของแบบสอบถามหลายรายการจะได้รับการวิเคราะห์ เหล่านี้เป็นแบบสอบถามโดยใช้ID (เรียงคีย์ฟิลด์) และใช้firstName (ที่ไม่ใช่คีย์ข้อมูลไม่ได้เรียงลำดับ)
ตัวอย่างที่ 1 -เรียงลำดับฟิลด์ที่ไม่เรียงลำดับแล้ว
ให้ฐานข้อมูลตัวอย่างของเราr = 5,000,000
บันทึกของขนาดคงที่ให้ความยาวบันทึกR = 204
ไบต์และพวกเขาจะถูกเก็บไว้ในตารางโดยใช้เครื่องยนต์ MyISAM ซึ่งใช้B = 1,024
ไบต์ขนาดบล็อกเริ่มต้น ปัจจัยการปิดกั้นของตารางจะbfr = (B/R) = 1024/204 = 5
บันทึกต่อดิสก์บล็อก จำนวนรวมของบล็อกที่ต้องใช้เพื่อเก็บตารางคือN = (r/bfr) = 5000000/5 = 1,000,000
บล็อก
การค้นหาเชิงเส้นในฟิลด์ id จะต้องใช้ค่าเฉลี่ยของการN/2 = 500,000
เข้าถึงบล็อกเพื่อค้นหาค่าเนื่องจากฟิลด์ id เป็นฟิลด์สำคัญ แต่เนื่องจากมีการเรียงลำดับฟิลด์ id ด้วยจึงสามารถทำการค้นหาแบบไบนารีที่ต้องการการlog2 1000000 = 19.93 = 20
เข้าถึงบล็อกโดยเฉลี่ย ทันทีที่เราเห็นว่านี่เป็นการปรับปรุงที่รุนแรง
ตอนนี้เขตข้อมูลFirstNameไม่ได้ถูกจัดเรียงหรือไม่มีเขตข้อมูลหลักดังนั้นการค้นหาแบบไบนารีจึงเป็นไปไม่ได้และไม่มีค่าที่ไม่ซ้ำกันดังนั้นตารางจะต้องค้นหาจนถึงจุดสิ้นสุดสำหรับการN = 1,000,000
เข้าถึงบล็อกที่ถูกต้อง เป็นสถานการณ์นี้ที่การทำดัชนีมีจุดมุ่งหมายเพื่อแก้ไข
เนื่องจากเรคคอร์ดดัชนีมีเฉพาะฟิลด์ที่จัดทำดัชนีและตัวชี้ไปยังเรกคอร์ดดั้งเดิมมันมีเหตุผลที่จะมีขนาดเล็กกว่าเรกคอร์ด multi-field ที่ชี้ไป ดังนั้นดัชนีเองจึงต้องการดิสก์บล็อกน้อยกว่าตารางดั้งเดิมซึ่งต้องใช้บล็อกน้อยกว่าในการเข้าถึงเพื่อวนซ้ำ สคีมาสำหรับดัชนีในฟิลด์FirstNameมีการระบุไว้ด้านล่าง
ชื่อเขตข้อมูลชนิดข้อมูลขนาดบนดิสก์
firstName Char (50) 50 ไบต์
(ตัวชี้บันทึก) พิเศษ 4 ไบต์
หมายเหตุ : ตัวชี้ใน MySQL มีความยาว 2, 3, 4 หรือ 5 ไบต์ขึ้นอยู่กับขนาดของตาราง
ตัวอย่างที่ 2 - การจัดทำดัชนี
รับฐานข้อมูลตัวอย่างของเรกr = 5,000,000
คอร์ดที่มีความยาวเรกคอร์ดดัชนีR = 54
ไบต์และใช้B = 1,024
ไบต์ขนาดบล็อกเริ่มต้น ปัจจัยการปิดกั้นของดัชนีจะbfr = (B/R) = 1024/54 = 18
บันทึกต่อดิสก์บล็อก จำนวนบล็อกทั้งหมดที่ต้องใช้เพื่อเก็บดัชนีคือN = (r/bfr) = 5000000/18 = 277,778
บล็อก
ตอนนี้การค้นหาที่ใช้ฟิลด์FirstNameสามารถใช้ดัชนีเพื่อเพิ่มประสิทธิภาพได้ สิ่งนี้ช่วยให้การค้นหาแบบไบนารีของดัชนีที่มีค่าเฉลี่ยของการlog2 277778 = 18.08 = 19
เข้าถึงบล็อก เพื่อหาที่อยู่ของระเบียนจริงซึ่งต้องมีการปิดกั้นการเข้าถึงเพิ่มเติมในการอ่านนำไปรวมกับ19 + 1 = 20
การเข้าถึงบล็อกหนทางไกลจาก 1,000,000 บล็อกการเข้าถึงที่จำเป็นในการหาfirstNameแข่งขันในตารางที่ไม่ได้จัดทำดัชนี
ควรใช้เมื่อใด
เนื่องจากการสร้างดัชนีต้องการพื้นที่ดิสก์เพิ่มเติม (277,778 บล็อกพิเศษจากตัวอย่างข้างต้นเพิ่มขึ้น ~ 28%) และดัชนีมากเกินไปอาจทำให้เกิดปัญหาที่เกิดจากข้อ จำกัด ขนาดระบบไฟล์ต้องใช้ความคิดอย่างรอบคอบเพื่อเลือกสิ่งที่ถูกต้อง เขตข้อมูลที่จะจัดทำดัชนี
เนื่องจากดัชนีจะใช้เพื่อเพิ่มความเร็วในการค้นหาเขตข้อมูลที่ตรงกันภายในเร็กคอร์ดเท่านั้นทำให้เหตุผลที่ว่าการทำดัชนีฟิลด์ที่ใช้สำหรับเอาต์พุตจะเสียพื้นที่ดิสก์และเวลาในการประมวลผลเมื่อทำการแทรกหรือลบเท่านั้น ควรหลีกเลี่ยง เมื่อพิจารณาจากลักษณะของการค้นหาแบบไบนารีความสำคัญหรือความเป็นเอกลักษณ์ของข้อมูลเป็นสิ่งสำคัญ การจัดทำดัชนีในเขตข้อมูลที่มีระดับความสำคัญเป็น 2 จะแบ่งข้อมูลออกเป็นครึ่งส่วนในขณะที่ส่วนที่มีความสำคัญเชิงลบเท่ากับ 1,000 จะส่งกลับประมาณ 1,000 รายการ ด้วยความสำคัญที่ต่ำประสิทธิภาพจะลดลงเป็นการเรียงแบบเชิงเส้นและเคียวรีเครื่องมือเพิ่มประสิทธิภาพจะหลีกเลี่ยงการใช้ดัชนีถ้าความสำคัญน้อยกว่า 30% ของจำนวนบันทึกทำให้ดัชนีเสียพื้นที่อย่างมีประสิทธิภาพ