Cơ sở dữ liệu 15/11/2026 5 phút

SQLite đo thật — VACUUM, freelist và phân mảnh: xóa chín mươi phần trăm dữ liệu mà file vẫn nguyên ba mươi bảy MB vì trang trống chỉ vào freelist để tái dùng, VACUUM mới dựng lại file xuống còn một phần mười

Phần 10 sê-ri SQLite đo thật: xóa dữ liệu KHÔNG làm file nhỏ lại. Đo trong container sqlite 3.45.3: bảng một triệu dòng chiếm 37 MB; xóa 90% số dòng thì file vẫn đúng 37 MB, page_count không đổi, nhưng freelist_count nhảy lên 8202 trang trống chờ tái dùng. Freelist không lãng phí: chèn 250 nghìn dòng mới sau khi xóa thì file KHÔNG lớn thêm vì SQLite lấp các trang trống trước. Muốn thu hồi đĩa thật phải chạy VACUUM — nó dựng lại cả CSDL thành một file nén gọn: 37 MB xuống 3,6 MB, khoảng một phần mười, trong 19 mili-giây. Cùng với auto_vacuum NONE FULL INCREMENTAL để chọn cách thu hồi.