bigint tự tăng nhanh và gọn hơn; UUID đổi lấy tính tạo được ở phía client và không lộ số lượng bản ghi.
Chi phí của UUID ngẫu nhiên (v4):
- Kích thước: 16 byte so với 8 byte. Khoá chính nằm trong mọi index phụ và mọi khoá ngoại, nên chênh lệch được nhân lên toàn database.
- Vị trí chèn ngẫu nhiên: id tăng dần luôn chèn vào cuối B-tree, chỉ làm nóng vài trang. UUID v4 rơi rải rác khắp cây → nhiều lần tách trang, cache hit thấp, index phình nhanh hơn khi bảng lớn.
Ưu điểm của UUID:
- Client/nhiều service sinh id trước khi ghi, hợp nhất dữ liệu từ nhiều nguồn không đụng nhau — quan trọng khi sharding hoặc ghi offline.
- Không đoán được id kế tiếp, tránh lộ thông tin qua URL.
Cách dung hoà thường được nêu: dùng UUID có thứ tự thời gian (UUIDv7, ULID) — vẫn duy nhất toàn cục nhưng phần đầu là timestamp nên chèn gần như tuần tự, lấy lại được tính cục bộ của B-tree.
Một lựa chọn khác hay gặp trong thực tế: giữ bigint làm khoá chính nội bộ (khoá ngoại, join) và thêm cột public_id uuid unique để lộ ra API. Được cả hai mặt, đổi lại thêm một index.
Lưu ý nhỏ: nếu lưu UUID hãy dùng kiểu uuid gốc (16 byte), không lưu dạng varchar(36) — bản chuỗi tốn hơn gấp đôi và so sánh chậm hơn.