Khi một bảng trong database chỉ có vài trăm dòng, việc tìm kiếm dữ liệu thường không tạo ra khác biệt rõ rệt về tốc độ. Nhưng khi bảng có hàng trăm nghìn hoặc hàng triệu dòng, việc tìm kiếm có thể trở nên tốn thời gian hơn.
Đây là lúc INDEX phát huy tác dụng.
Có thể hiểu đơn giản:
Index là một cấu trúc dữ liệu giúp database tìm kiếm và truy xuất dữ liệu nhanh hơn, thay vì phải kiểm tra từng dòng trong bảng.
1. Index là gì?
Giả sử chúng ta có bảng users:
| id | name | |
|---|---|---|
| 1 | An | [email protected] |
| 2 | Bình | [email protected] |
| 3 | Cường | [email protected] |
| … | … | … |
Khi chạy:
SELECT *
FROM users
WHERE email = '[email protected]';
Nếu cột email không có Index, database có thể phải kiểm tra lần lượt nhiều dòng để tìm email cần tìm.
Có thể hình dung:
users
↓
row 1 → không đúng
↓
row 2 → tìm thấy
↓
row 3
↓
...
Nếu bảng có hàng triệu dòng, việc này có thể tốn nhiều thời gian.
Khi tạo Index:
CREATE INDEX idx_users_email
ON users(email);
database có thêm một cấu trúc được tổ chức để hỗ trợ việc tìm kiếm theo email.
Query
↓
Index email
↓
Tìm vị trí dữ liệu
↓
Table
↓
Kết quả
2. Tại sao cần Index?
Mục đích chính của Index là tăng tốc độ truy vấn.
Ví dụ thường gặp:
SELECT *
FROM users
WHERE email = '[email protected]';
hoặc:
SELECT *
FROM products
WHERE name = 'Laptop';
hoặc:
SELECT *
FROM orders
WHERE customer_id = 10;
Những cột thường xuyên xuất hiện trong WHERE, JOIN, ORDER BY hoặc một số truy vấn khác có thể là ứng viên để tạo Index.
Không có Index, database có thể phải thực hiện Full Table Scan.
Không có Index:
Table
↓
1 → 2 → 3 → 4 → 5 → ... → 1,000,000
Có Index:
Query
↓
Index
↓
Tìm vị trí phù hợp
↓
Lấy dữ liệu
Với bảng lớn và truy vấn phù hợp, Index có thể giúp giảm đáng kể lượng dữ liệu cần kiểm tra.
3. Index có phải lúc nào cũng tốt không?
Không.
Index giúp đọc dữ liệu nhanh hơn, nhưng nó cũng có chi phí.
Khi thực hiện:
INSERT
UPDATE
DELETE
database không chỉ phải thay đổi dữ liệu trong bảng mà còn có thể phải cập nhật các Index liên quan.
Ví dụ:
INSERT
↓
Table được cập nhật
↓
Index cũng phải cập nhật
Ngoài ra, Index cũng sử dụng thêm bộ nhớ/disk.
Vì vậy, không nên tạo Index cho mọi cột chỉ vì nghĩ rằng “càng nhiều Index càng nhanh”.
4. Khi nào nên dùng Index?
Index thường hữu ích với những cột:
- Thường xuyên được tìm kiếm bằng
WHERE - Thường xuyên được sử dụng để
JOIN - Thường xuyên được dùng để sắp xếp hoặc lọc
- Có lượng giá trị khác nhau tương đối lớn
Ví dụ:
SELECT *
FROM orders
WHERE customer_id = 100;
Nếu truy vấn này được sử dụng rất thường xuyên trên một bảng orders lớn, customer_id có thể là một ứng viên để tạo Index:
CREATE INDEX idx_orders_customer_id
ON orders(customer_id);
Ngược lại, nếu một bảng nhỏ hoặc một cột gần như không được sử dụng để tìm kiếm, việc tạo Index có thể không mang lại nhiều lợi ích.
Quan trọng hơn, việc có nên tạo Index hay không nên được xác định dựa trên query thực tế và execution plan, thay vì chỉ dựa vào quy tắc cố định.
Kết luận
Index có thể được hiểu đơn giản như mục lục của một cuốn sách.
Thay vì đọc từng trang để tìm một nội dung, bạn có thể nhìn vào mục lục để xác định vị trí cần tìm.
Không có Index
→ Có thể phải quét nhiều dòng
→ Tìm kiếm chậm hơn khi bảng lớn
Có Index
→ Có cấu trúc hỗ trợ tìm kiếm
→ Có thể truy xuất nhanh hơn
Nhưng Index không phải là “cứ thêm càng nhiều càng tốt”. Nó giúp tối ưu việc đọc dữ liệu, đồng thời tạo thêm chi phí cho việc ghi và cập nhật dữ liệu.
Index giúp tìm dữ liệu nhanh hơn, nhưng Index cũng có chi phí.


