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 บังคับ