Index là một cấu trúc dữ liệu song song với bảng. Đọc nhanh vì tra cứu chỉ đi qua vài tầng B-tree thay vì quét toàn bộ bảng, nhưng mỗi thao tác ghi phải cập nhật cả bảng lẫn từng index.
Chi phí ghi cụ thể:
- INSERT: một dòng mới phải được chèn vào mọi index của bảng. Bảng có 6 index thì một INSERT sinh 7 lần ghi (1 heap + 6 B-tree), kèm 7 phần ghi vào WAL.
- UPDATE: chỉ index nào chứa cột bị đổi mới phải sửa — nhưng nếu dòng mới không nằm vừa cùng trang thì mọi index đều phải trỏ lại.
- DELETE: entry trong index không biến mất ngay, phải chờ dọn dẹp nền (autovacuum ở PostgreSQL).
Ngoài ra index chiếm dung lượng đĩa và cạnh tranh cache với dữ liệu thật — index ít dùng vẫn đẩy trang dữ liệu nóng ra khỏi cache.
Bao nhiêu là quá nhiều: không có con số cứng. Nguyên tắc thực dụng là mỗi index phải phục vụ ít nhất một truy vấn thật có tần suất đáng kể. Bảng ghi rất nhiều (log, event) nên giữ tối thiểu; bảng đọc nhiều (danh mục sản phẩm) có thể chấp nhận nhiều hơn. Cách kiểm chứng là đo idx_scan để loại index không ai dùng, thay vì đoán.