Nghệ thuật Tối ưu hóa Database Index: Cơ chế và Thực tế
Chỉ số (Index) được ví như mục lục cuốn sách, giúp cơ sở dữ liệu (DBMS) truy xuất thông tin nhanh chóng thay vì quét toàn bộ bảng dữ liệu (Table Scan / Sequential Scan). Tuy nhiên, hiểu sai và lạm dụng Index là nguyên nhân hàng đầu làm chậm hệ thống ghi (Write) và ngốn tài nguyên lưu trữ phần cứng.
1. B-Tree Index hoạt động như thế nào?
Hầu hết các RDBMS mặc định dùng cấu trúc cây cân bằng (B-Tree - Balanced Tree) để đánh chỉ số. Với độ phức tạp tìm kiếm chỉ là O(log N), B-Tree cho phép nhanh chóng định vị bất kỳ bản ghi nào bằng cách phân nhánh dữ liệu thành các Node gốc, Node trung gian và Node lá.
2. Nguyên tắc vàng: Khi nào cần thêm Index?
- Cột điều kiện tìm kiếm: Các cột thường xuyên xuất hiện trong điều kiện
WHERE(ví dụ:user_id,status). - Cột khóa ngoại dùng để JOIN: Đánh chỉ số cho các cột liên kết để tăng tốc độ kết hợp bảng dữ liệu.
- Cột sắp xếp dữ liệu: Các cột dùng trong mệnh đề
ORDER BY(nhưcreated_at) giúp loại bỏ bước sắp xếp dữ liệu trên RAM (File-sort). - Composite Index (Chỉ số kết hợp): Đánh index trên nhiều cột, ví dụ:
(category_id, status, created_at). Thứ tự khai báo cực kỳ quan trọng! Quy tắc Leftmost-prefix bắt buộc truy vấn phải chứa cột đầu tiên của index mới kích hoạt được.
-- Xem giải trình truy vấn trong PostgreSQL để phát hiện Slow Query
EXPLAIN ANALYZE
SELECT * FROM posts
WHERE category_id = 3 AND status = 'published'
ORDER BY created_at DESC;
-- Nếu thấy "Seq Scan on posts" -> Database đang quét toàn bộ bảng.
-- Giải pháp: Thêm Composite Index thích hợp:
CREATE INDEX idx_posts_category_status_created
ON posts(category_id, status, created_at DESC);
3. Khi nào không nên dùng Index?
- Bảng dữ liệu quá nhỏ: Nếu bảng chỉ có vài chục dòng, Sequential Scan nhanh hơn đọc Index rất nhiều.
- Cột có độ phân biệt (Cardinality) thấp: Cột có dữ liệu lặp lại nhiều như cột giới tính (Nam/Nữ) hay boolean. Việc tìm kiếm trên cột này bằng index không mang lại giá trị lọc cao.
- Cột cập nhật dữ liệu liên tục: Mỗi khi thực hiện
INSERT,UPDATE, hoặcDELETE, hệ thống phải cập nhật lại cấu trúc cây B-Tree. Quá nhiều index sẽ bóp nghẹt hiệu năng ghi của cơ sở dữ liệu. - Index không sử dụng (Unused Index): Cần định kỳ giám sát xem index nào không bao giờ được truy vấn tới và xóa bỏ để giải phóng dung lượng đĩa cứng.
Bình luận (0)
Đang tải bình luận...