ฉันทำวิจัยจำนวนมากเกี่ยวกับวิธีการบำรุงรักษาดัชนีใน MySQL เพื่อป้องกันการแตกแฟรกเมนต์และเพื่อเพิ่มประสิทธิภาพการดำเนินการของแบบสอบถามบางอย่าง
ฉันคุ้นเคยกับสูตรนั้นที่คำนวณอัตราส่วนระหว่างพื้นที่ว่างสูงสุดที่มีอยู่สำหรับตาราง VS พื้นที่ที่ใช้โดยข้อมูลและดัชนี
อย่างไรก็ตามคำถามหลักของฉันยังคงไม่มีคำตอบ บางทีนี่อาจเป็นเพราะฉันคุ้นเคยกับการบำรุงรักษาดัชนีใน SQL Server และฉันมักจะคิดว่าใน MySQL มันควรจะคล้ายกัน
ในเซิร์ฟเวอร์ SQL คุณสามารถมีดัชนีได้หลายดัชนีและแต่ละดัชนีสามารถมีการแตกแฟรกเมนต์ระดับต่างกัน จากนั้นคุณสามารถเลือกและดำเนินการ 'REORGANIZE' หรือ 'REBUILD' ในดัชนีนั้นโดยไม่กระทบต่อส่วนที่เหลือ
ความรู้ของฉันอย่างดีที่สุดไม่มี 'การแตกแฟรกเมนต์ของตาราง' และ SQL Server ไม่ได้จัดเตรียมเครื่องมือใด ๆ เพื่อแก้ไข 'การแตกแฟรกเมนต์ตาราง' สิ่งที่มีให้คือเครื่องมือในการตรวจสอบการแตกแฟรกเมนต์ของดัชนี (เข้าใจเช่นอัตราส่วนระหว่างจำนวนหน้าที่ใช้โดยดัชนีเทียบกับความสมบูรณ์ของหน้าและความต่อเนื่องกัน) รวมทั้งการกระจายตัวของภายในและภายนอก
ทั้งหมดนี้ค่อนข้างตรงไปตรงมาที่จะเข้าใจอย่างน้อยก็สำหรับฉัน
ตอนนี้เมื่อถึงคราวที่ต้องรักษาดัชนีใน MySQL จะมีเพียงแนวคิดของ 'การแตกแฟรกเมนต์ของตารางดังกล่าวข้างต้น
ตารางใน MySQL สามารถมีดัชนีได้หลายดัชนี แต่เมื่อฉันตรวจสอบ 'อัตราส่วนการกระจายตัวของ' ด้วยสูตรที่มีชื่อเสียงนั้นฉันไม่เห็นการกระจายตัวของดัชนีแต่ละรายการ แต่ตารางโดยรวม
เมื่อฉันต้องการเพิ่มประสิทธิภาพดัชนีใน MySQL ฉันไม่ได้เลือกดัชนีเฉพาะเพื่อดำเนินการ (เช่นใน SQL Server) แต่ฉันทำงาน 'OPTIMIZE' ในตารางทั้งหมดซึ่งน่าจะส่งผลต่อดัชนีทั้งหมด
เมื่อตารางได้รับการปรับให้เหมาะสมใน MySQL อัตราส่วนระหว่างพื้นที่ที่ใช้โดย data + index VS จะลดพื้นที่โดยรวมซึ่งแนะนำการจัดระเบียบทางกายภาพบางประเภทในฮาร์ดไดรฟ์ใหม่ซึ่งแปลเป็นการลดพื้นที่ทางกายภาพ อย่างไรก็ตามการกระจายตัวของดัชนีไม่เพียง แต่เกี่ยวกับพื้นที่ทางกายภาพ แต่โครงสร้างของต้นไม้ที่มีการเปลี่ยนแปลงตลอดเวลาเนื่องจากการแทรกและการปรับปรุง
ในที่สุดฉันก็ได้ตารางใน InnoDB / MySQL ตารางนั้นมีระเบียน 3 ล้านระเบียน 105 คอลัมน์และดัชนี 55 รายการ มันคือ 1.5GB ไม่รวมดัชนีซึ่งเป็น 2.1GB
ตารางนั้นมีการเข้าชมหลายพันครั้งต่อวันสำหรับการอัปเดตการแทรก (เราไม่ได้ลบบันทึก)
ตารางนั้นถูกสร้างขึ้นเป็นเวลาหลายปีและฉันรู้ว่าไม่มีใครรักษาดัชนีไว้ได้
ฉันคาดหวังว่าจะพบการกระจายตัวของขนาดใหญ่ในนั้น แต่เมื่อฉันทำการคำนวณการกระจายตัวตามที่กำหนด
free_space / (data_length + index_length)
ปรากฎว่าฉันมีการกระจายตัวเพียง 0.2% IMHO ที่ค่อนข้างไม่สมจริง
ดังนั้นคำถามใหญ่คือ:
- ฉันจะตรวจสอบการกระจายตัวของดัชนีเฉพาะใน MySQL ได้อย่างไรไม่ใช่ตารางโดยรวม
- OPTIMIZE TABLE จริง ๆ แล้วแก้ไขการกระจายตัวของดัชนีภายใน / ภายนอกเช่นเดียวกับใน SQL Server หรือไม่?
- เมื่อฉันปรับตารางใน MySQL ให้เหมาะสมมันจริง ๆ แล้วสร้างดัชนีทั้งหมดในตารางหรือไม่
- เป็นจริงหรือไม่ที่จะคิดว่าการลดพื้นที่ทางกายภาพของดัชนี (โดยไม่ต้องสร้างต้นไม้ขึ้นใหม่) จะแปลเป็นประสิทธิภาพที่ดีขึ้นจริงหรือ