Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

จัดการ Auto Increment ID Fragmentation ใน MySQL

Auto Increment ID อาจเกิด "ช่องว่าง" (Gaps) จากการ DELETE, RESTART Server, หรือ INSERT ที่ล้มเหลว ใน InnoDB 5.6+ สามารถ Reuse ID ได้โดยระบุ ID เองตอน INSERT

สถานการณ์ที่เกิด Fragmentation

  • DELETE แถวที่มี ID สูงสุด
  • Restart MySQL Server (InnoDB รีเซ็ต Counter จาก MAX(id)+1)
  • INSERT ล้มเหลว (Rollback) แต Counter เพิ่มไปแล้ว

ตัวอย่าง

mysql> CREATE TABLE UniqueAutoId (id INT AUTO_INCREMENT, UNIQUE(id));
mysql> INSERT INTO UniqueAutoId VALUES (), (), (), (), ();  -- ID 1-5

mysql> DELETE FROM UniqueAutoId WHERE id = 5;  -- ลบ ID สูงสุด
mysql> INSERT INTO UniqueAutoId VALUES ();     -- ID ถัดไป = 6 (ไม่ Reuse 5)

mysql> DELETE FROM UniqueAutoId WHERE id = 2;  -- ลบ ID กลาง
-- ID 2,5 ว่าง (Fragmented)

Reuse ID ได้อย่างไร?

-- ระบุ ID เองตอน INSERT (ถ้ายังว่าง)
INSERT INTO UniqueAutoId (id) VALUES (2);  -- ใช้ ID 2 ที่ว่างได้

Reset Auto Increment (ถ้าต้องการ)

ALTER TABLE UniqueAutoId AUTO_INCREMENT = 1;  -- รีเซ็ตเป็น MAX(id)+1
ข้อสังเกต: Gaps เป็นปกติและไม่ส่งผลต่อ Performance ควรยอมรับ Gaps ไว้ แทนที่จะพยายาม Reuse (ซับซ้อน, Race Condition) เว้นแต่มี Business Reason บังคับ