1. Database Index là gì?
Database Index (chỉ mục cơ sở dữ liệu) là một cấu trúc dữ liệu được database duy trì để tìm kiếm và truy xuất bản ghi hiệu quả hơn, thay vì phải kiểm tra toàn bộ các dòng trong bảng ở nhiều trường hợp.
Hãy tưởng tượng một bảng users chứa hàng triệu người dùng. Khi cần tìm một user theo email, nếu không có index phù hợp, database có thể phải kiểm tra lần lượt rất nhiều bản ghi để xác định bản ghi cần tìm. Quá trình này thường được gọi là table scan hoặc sequential scan, tùy cách database thực hiện.
Khi có index trên email, database có thể sử dụng cấu trúc chỉ mục để tìm những giá trị khớp nhanh hơn. Index thường lưu các giá trị được lập chỉ mục cùng thông tin giúp xác định bản ghi tương ứng; cách tổ chức chi tiết phụ thuộc loại index và hệ quản trị.
Ví dụ:
CREATE INDEX idx_users_email
ON users(email);
Index trên giúp database có thêm một cách truy cập dữ liệu khi xử lý những truy vấn phù hợp với email.
2. Database hoạt động thế nào khi có Index?
Giả sử bảng products có hàng trăm nghìn bản ghi và application thường tìm sản phẩm theo sku.
SELECT id, name, price
FROM products
WHERE sku = 'KB-1001';
Nếu không có index phù hợp, database có thể cần quét nhiều dòng để tìm sản phẩm có SKU tương ứng.
Nếu tạo index:
CREATE INDEX idx_products_sku
ON products(sku);
Database có thể tìm giá trị KB-1001 qua index trước, sau đó truy xuất bản ghi tương ứng trong bảng. Với cấu trúc index phù hợp và dữ liệu có tính chọn lọc tốt, quá trình này thường hiệu quả hơn quét toàn bộ bảng.
3. B-Tree Index – Loại Index quan trọng nhất
Trong PostgreSQL, B-tree là loại index mặc định khi tạo index thông thường; với MySQL sử dụng InnoDB, B-tree cũng là cấu trúc nền tảng cho những index thông dụng.
B-tree phù hợp với nhiều thao tác phổ biến:
- Tìm theo giá trị chính xác với
=. - Tìm theo khoảng giá trị với
>,<,BETWEEN. - Tìm một tập giá trị với
IN. - Hỗ trợ một số truy vấn sắp xếp bằng
ORDER BY. - Hỗ trợ các truy vấn lọc theo prefix phù hợp, chẳng hạn
LIKE 'abc%', tùy collation, operator class và cấu hình database.
Ví dụ:
SELECT *
FROM products
WHERE price BETWEEN 100 AND 500;
Nếu application thường tìm sản phẩm theo khoảng giá, index trên price có thể hữu ích:
CREATE INDEX idx_products_price
ON products(price);
Một ví dụ khác:
SELECT id, name
FROM users
WHERE email = '[email protected]';
Index B-tree trên email thường phù hợp với kiểu tìm kiếm này.
4. Các loại Index phổ biến trong PostgreSQL và MySQL
GIN và GiST trong PostgreSQL
PostgreSQL có những loại index chuyên biệt để xử lý dữ liệu phức tạp hơn:
GIN (Generalized Inverted Index) phù hợp với dữ liệu mà một bản ghi chứa nhiều phần tử có thể được tìm kiếm riêng, chẳng hạn một số kiểu truy vấn JSONB, array hoặc full-text search. GIN lập chỉ mục những phần tử bên trong giá trị thay vì chỉ xem toàn bộ giá trị như một scalar đơn giản.
GiST (Generalized Search Tree) là một framework index hỗ trợ nhiều kiểu tìm kiếm chuyên biệt, chẳng hạn một số truy vấn không gian, phạm vi hoặc dữ liệu có quan hệ lân cận, tùy operator class được sử dụng.
FULLTEXT và SPATIAL trong MySQL
MySQL có FULLTEXT index cho các truy vấn tìm kiếm toàn văn trong những kiểu cột được hỗ trợ. Nó phục vụ một loại tìm kiếm khác với việc dùng B-tree để so khớp chuỗi chính xác.
MySQL cũng hỗ trợ SPATIAL index cho dữ liệu không gian phù hợp. Việc sử dụng cần tuân theo loại dữ liệu và điều kiện truy vấn được storage engine hỗ trợ.
5. Covering Index – Khi Index chứa đủ dữ liệu cho query
Thông thường, database dùng index để tìm bản ghi rồi đọc thêm các column cần thiết từ table. Nhưng trong một số trường hợp, index đã chứa toàn bộ dữ liệu mà query cần, giúp database tránh phải truy cập table theo cách thông thường.
Đây là ý tưởng của covering index.
Ví dụ:
SELECT user_id, status, created_at
FROM orders
WHERE user_id = 10
AND status = 'paid';
Nếu index được thiết kế để chứa các column phù hợp, database có thể lấy nhiều hoặc toàn bộ dữ liệu cần thiết từ index mà không phải truy xuất mỗi row trong table như trước.
6. Tổng kết
Database Indexes là công cụ quan trọng để tối ưu truy vấn, nhưng chỉ mang lại hiệu quả khi được thiết kế dựa trên cách application sử dụng dữ liệu. B-tree là điểm bắt đầu phù hợp cho nhiều truy vấn thông thường. Single-column index giúp tìm kiếm theo một column; composite index xử lý những truy vấn kết hợp nhiều điều kiện; unique index còn bảo vệ tính duy nhất.





Khoá học lập trình game con rắn cho trẻ em




