Index Write Overhead
Trade-off cốt lõi của indexing: càng nhiều index → write càng chậm, vì mỗi lần ghi phải cập nhật tất cả index liên quan.
Ví dụ cụ thể
Bảng users có 5 index:
- INSERT 1 row → database phải thêm entry vào CẢ 5 index
- UPDATE cột email (nằm trong 2 index) → 2 index bị cập nhật
- UPDATE cột bio (không nằm trong index nào) → 0 index bị cập nhật
- DELETE 1 row → xóa entry khỏi CẢ 5 indexLưu ý tinh tế: UPDATE chỉ tốn chi phí index khi cột nằm trong index bị thay đổi.
Đừng lo lắng quá
- Thực tế hầu hết app đọc nhiều hơn ghi rất nhiều (read:write thường 90:10 hoặc cao hơn)
- Mỗi bảng thường chỉ cần 3-7 index
- Chi phí write thêm hầu như không đáng kể so với lợi ích read
Bao nhiêu index là quá nhiều?
Không có con số cố định, nhưng nếu bảng có hơn 10 index và write performance giảm đáng kể → lúc nên review. Dùng query kiểm tra Unused Index để tìm và xóa index thừa.
Quy tắc dọn index trùng lặp
✅ Index (country, lastname, firstname) BAO GỒM chức năng của:
- (country)
- (country, lastname)
→ Xóa 2 index đơn/đôi này nếu tồn tại
❌ Nhưng KHÔNG BAO GỒM:
- (country, lastname, telephone) → cột cuối khác
- (lastname, country) → thứ tự cột khácLiên quan
- B+ Tree - database tự quản lý index khi ghi
- Primary Key và thứ tự Insert - chi phí ghi phụ thuộc thứ tự giá trị
- Unused Index - cách phát hiện index thừa
- Index-Only Query và Covering Index - thêm cột vào index cũng làm tăng chi phí ghi, đừng lạm dụng