Database Index — Câu chuyện về thứ giúp query của bạn nhanh hơn 100 lần
Mở đầu
Hôm qua mình ngồi debug một cái query chậm như rùa — 3 giây cho một cái SELECT đơn giản trên bảng có 2 triệu dòng. Mình biết ngay vấn đề nằm ở đâu: thiếu index. Thêm một cái index, query từ 3 giây xuống còn 5 mili giây. Nghe như phép thuật, nhưng thực ra không có gì huyền bí cả. Đây là câu chuyện về Database Index — thứ mà dev nào cũng từng xài, nhưng không phải ai cũng hiểu.
Ảnh: Kevin Ku — Pexels
B-Tree — trái tim của Index
Đa số database đều dùng B-Tree (Balanced Tree) làm cấu trúc index chính. Nôm na, B-Tree giống như một cái cây lộn ngược — dữ liệu được sắp xếp theo thứ tự và phân nhánh để việc tìm kiếm chỉ mất O(log n) thay vì O(n) nếu quét toàn bộ bảng (full table scan).
Cụ thể, thay vì đọc từng dòng một để tìm dữ liệu (kiểu "đọc lướt cả cuốn sách để tìm một từ"), B-Tree cho phép database rẽ nhánh như tra mục lục: "bỏ qua nửa cuốn sách, rẽ trái, rẽ phải, tới trang cần tìm". Với 1 triệu dòng, B-Tree chỉ mất khoảng 20 lần rẽ nhánh là tới đích. Còn full scan thì mất 1 triệu lần — tự tính tốc độ chênh lệch nha.
Kinh nghiệm xài index trong thực tế
Đi làm mấy năm, mình đúc kết vài điều về index mà hy vọng có ích cho các bạn:
Nên index khi:
- Cột hay dùng trong
WHERE,JOIN,ORDER BY - Bảng lớn (trên 100K dòng)
- Cột có độ phân biệt cao (cardinality lớn) — như ID, email; không phải boolean hay gender
Không nên index (hoặc cẩn thận khi dùng):
- Cột hay bị
UPDATEliên tục — mỗi lần update là index phải rebuild, chậm hơn là lợi - Bảng nhỏ xíu — vài trăm dòng, index chỉ tốn chỗ mà query vẫn nhanh nhờ full scan
- Composite index sai thứ tự —
(a, b)khác(b, a)hoàn toàn. Cột nào dùng trongWHEREtrước thì để trước
Cái mình hay thấy các bạn junior mắc là: insert speed chậm mà không biết tại sao. Lý do thường là có quá nhiều index trên một bảng. Mỗi lần insert, database phải ghi dữ liệu vào đúng vị trí trong từng cái B-Tree — càng nhiều index, insert càng chậm.
Kết
Index là một trong những kỹ thuật tối ưu database đơn giản mà hiệu quả nhất. Nhưng không phải cứ thêm index là tốt — cần hiểu bản chất của B-Tree và workload của hệ thống để đưa ra quyết định đúng. Hồi mới đi làm, mình từng thêm index đầy bảng mà không hiểu sao production vẫn chậm. Sau này mới biết mình dùng composite index sai thứ tự.
Mấy bạn có kỷ niệm gì với database index không? Chia sẻ với mình dưới comment nha!
📋 Phụ lục thuật ngữ
- Database Index — cấu trúc dữ liệu (thường là B-Tree) giúp tăng tốc truy vấn, giống như mục lục của cuốn sách
- B-Tree — cây cân bằng, cấu trúc index phổ biến nhất, cho phép tìm kiếm, chèn, xoá với độ phức tạp O(log n)
- Full Table Scan — quét toàn bộ bảng tuần tự, độ phức tạp O(n), thường xảy ra khi không có index phù hợp