คำตอบสั้น ๆ :
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
คำตอบ "คุณต้องรู้"
ก่อนอื่นคุณต้องเข้าใจว่าตาราง Mysql มีการแยกส่วนเมื่อแถวถูกอัพเดตดังนั้นจึงเป็นสถานการณ์ปกติ เมื่อตารางถูกสร้างขึ้นให้พูดว่านำเข้าโดยใช้การถ่ายโอนข้อมูลที่มีข้อมูลแถวทั้งหมดจะถูกเก็บไว้โดยไม่มีการกระจายตัวในหลายหน้าขนาดคงที่ เมื่อคุณอัปเดตแถวที่มีความยาวผันแปรหน้าเว็บที่มีแถวนี้จะถูกแบ่งออกเป็นสองหน้าขึ้นไปเพื่อเก็บการเปลี่ยนแปลงและหน้าใหม่สองหน้า (ขึ้นไป) นี้มีช่องว่างที่เติมช่องว่างที่ไม่ได้ใช้
สิ่งนี้จะไม่ส่งผลต่อประสิทธิภาพเว้นแต่ว่าการแตกแฟรกเมนต์จะเพิ่มขึ้นมากเกินไป อะไรคือการกระจายตัวมากเกินไปเรามาดูข้อความค้นหาที่คุณต้องการ:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
DATA_LENGTH และ INDEX_LENGTH เป็นพื้นที่ที่ข้อมูลและดัชนีของคุณกำลังใช้และ DATA_FREE คือจำนวนไบต์ทั้งหมดที่ไม่ได้ใช้ในหน้าตารางทั้งหมด (การกระจายตัว)
นี่คือตัวอย่างของตารางการผลิตจริง
| ENGINE | TABLE_NAME | data_length | index_length | data_free |
| InnoDB | comments | 896 | 316 | 5 |
ในกรณีนี้เรามีตารางที่ใช้ (896 + 316) = 1212 MB และมีพื้นที่ว่าง 5 MB นี่หมายถึง "อัตราส่วนการกระจายตัว" ของ:
5/1212 = 0.0041
... อันไหนคือ "อัตราส่วนการกระจายตัวที่ต่ำมาก"
ฉันทำงานกับตารางที่มีอัตราส่วนใกล้กับ 0.2 (หมายถึง 20% ของช่องว่าง) และไม่เคยสังเกตคำสั่งที่ช้าลงแม้ว่าฉันปรับตารางให้เหมาะสมประสิทธิภาพก็เหมือนกัน แต่ใช้ตารางเพิ่มประสิทธิภาพบนตาราง 800MB ใช้เวลานานและบล็อกตารางเป็นเวลาหลายนาทีซึ่งไม่สามารถทำได้กับการผลิต
ดังนั้นหากคุณพิจารณาสิ่งที่คุณชนะในการแสดงและเวลาที่เสียไปกับการปรับตารางให้เหมาะสมฉันไม่ต้องการปรับให้เหมาะสม
ถ้าคุณคิดว่ามันจะดีกว่าสำหรับการจัดเก็บดูอัตราส่วนของคุณและดูว่าคุณสามารถประหยัดพื้นที่ได้มากเท่าใดเมื่อปรับให้เหมาะสม ปกติแล้วจะไม่มากเกินไปดังนั้นฉันจึงไม่ต้องการปรับให้เหมาะสม
และหากคุณปรับให้เหมาะสมการอัปเดตครั้งต่อไปจะสร้างช่องว่างโดยแบ่งหน้าเป็นสองหน้าขึ้นไป แต่การอัปเดตตารางที่กระจัดกระจายเร็วกว่าโต๊ะที่ไม่ได้แยกส่วนเพราะถ้าตารางมีการแยกส่วนการอัปเดตบนแถวไม่จำเป็นว่าจะต้องแยกหน้า
ฉันหวังว่านี่จะช่วยคุณได้