Hiểu về Database Indexing để không còn bị sếp mắng vì query chậm
1. Index là gì? (Hãy quên code đi và nhớ về thư viện)
Hãy tưởng tượng bạn vào một thư viện có 1 triệu cuốn sách. Nếu bạn muốn tìm cuốn "Lập trình Go cho người mới", bạn có 2 cách:
- Cách 1: Đi qua từng kệ, kiểm tra từng cuốn một từ đầu đến cuối (Đây gọi là Full Table Scan). Chắc chắn là bạn sẽ mất cả ngày!
- Cách 2: Bạn chạy ngay đến mục lục (Index) ở đầu mỗi khu vực hoặc máy tra cứu. Nó sẽ chỉ đích danh: "Cuốn đó nằm ở Kệ 5, Tầng 3, Vị trí số 12". Bạn chỉ mất 30 giây để lấy được sách.
Trong Database, Index chính là cái "mục lục" đó. Nó là một cấu trúc dữ liệu tách biệt giúp tăng tốc độ tìm kiếm bản ghi dựa trên một hoặc nhiều cột.
2. "Cỗ máy" đằng sau: B-Tree Index
Đa số các Database (MySQL, Postgres...) sử dụng cấu trúc B-Tree để lưu trữ Index.Thay vì phải duyệt qua bản ghi,** B-Tree** giúp bạn tìm thấy dữ liệu với độ phức tạp chỉ là .
- Nếu bạn có 1 triệu bản ghi, thay vì duyệt 1 triệu lần, B-Tree chỉ cần khoảng 20 bước nhảy để tìm ra đúng vị trí. Đó là một sự khác biệt khủng khiếp về hiệu năng!
3. Những loại Index "vật bất ly thân"
- Primary Index: Tự động tạo ra cho Khóa chính (Primary Key). Đây là cái nhanh nhất vì nó thường đi kèm với dữ liệu vật lý (Clustered Index).
- Unique Index: Đảm bảo dữ liệu trong cột đó không được trùng nhau (như
Email,Phone). - Composite Index (Index tổ hợp): Index trên nhiều cột cùng lúc.
- Lưu ý: Thứ tự cột trong Composite Index rất quan trọng (Luật "Trái qua phải"). Nếu bạn index (
name,email) thì bạn có thể tìm nhanh theo name hoặcname+email, nhưng nếu chỉ tìm theo mỗiemailthì index này có thể sẽ không hoạt động. - Full-text Index: Dùng để tìm kiếm các đoạn văn bản dài (giống như Google Search thu nhỏ).
4. Index có phải là "viên đạn bạc"? (Cái giá phải trả)
Đừng vội vàng đánh Index cho tất cả các cột trong bảng! Index không miễn phí:
- Tốn bộ nhớ: Index cần không gian lưu trữ riêng trên đĩa cứng. Có những lúc file index còn nặng hơn cả file dữ liệu thật.
- Làm chậm thao tác Ghi (Write): Mỗi khi bạn
INSERT,UPDATE, hayDELETE, Database không chỉ sửa dữ liệu ở bảng chính mà còn phải hì hục cập nhật lại toàn bộ các "mục lục" liên quan.
Nguyên tắc vàng: Chỉ Index những cột thường xuyên xuất hiện trong mệnh đề WHERE, JOIN hoặc ORDER BY.
5. "Bắt bệnh" Query bằng EXPLAIN
Làm sao bạn biết câu Query của mình có đang dùng Index hay không? Hãy thêm từ khóa EXPLAIN vào trước câu lệnh SQL của bạn.
EXPLAIN SELECT * FROM users WHERE email = 'hoang@hasaki.vn';
Hãy nhìn vào cột type và key. Nếu type là ALL, nghĩa là bạn đang quét toàn bộ bảng (Rất tệ!). Nếu key hiện tên index bạn đã tạo, chúc mừng, bạn đã tối ưu thành công!
Lời kết
Database Indexing là một nghệ thuật đánh đổi giữa Tốc độ Đọc và Tốc độ Ghi. Một Backend Engineer giỏi là người biết đặt index "đúng nơi, đúng chỗ" để hệ thống luôn mượt mà ngay cả khi dữ liệu phình to.
Hy vọng bài viết này giúp anh em tự tin hơn khi xử lý các bài toán hiệu năng. Ở bài tới, mình sẽ nói về Database Normalization (Chuẩn hóa dữ liệu) – cách thiết kế bảng sao cho chuẩn chỉnh ngay từ đầu nhé!
All rights reserved