Trung BìnhDatabase iconDatabase

Index trong SQL là gì? Tại sao cần thiết?

  • B-tree index: cấu trúc cây cân bằng, mỗi node chứa sorted keys và pointers — tìm kiếm O(log n) thay vì O(n) full scan.
  • Bảng 10 triệu rows: full scan ~10s, B-tree index ~1ms.
  • Covering index: index chứa TẤT CẢ columns cần cho query → database chỉ đọc index, không cần đọc table (Index Only Scan) — CREATE INDEX idx_users_email_name ON users(email, name) cover SELECT name FROM users WHERE email = ?.
  • Partial index: index chỉ trên subset rows — CREATE INDEX idx_active_users ON users(email) WHERE deleted_at IS NULL nhỏ hơn, nhanh hơn full index nếu query luôn có WHERE deleted_at IS NULL.
  • Khi KHÔNG nên index: bảng < 1000 rows (full scan nhanh hơn), columns ít cardinality (boolean, status với 2-3 values), bảng write-heavy (mỗi write phải update tất cả indexes).
  • Index maintenance: REINDEX để rebuild index bị bloated; pg_stat_user_indexes xem index usage — drop indexes không được dùng.

Pitfall: function trên indexed column bypass index — WHERE LOWER(email) = ? không dùng index trên email; tạo functional index CREATE INDEX ON users(LOWER(email)) thay thế.

Xem toàn bộ Database cùng filter theo level & chủ đề con.

Mở danh sách Database