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.

Bài viết khác

N+1 Query Problem – Nguyên nhân, cách phát hiện và tối ưu

1. N+1 Query Problem là gì? N+1 Query Problem là vấn đề hiệu năng xảy ra khi application thực hiện một truy vấn để lấy danh sách bản ghi, sau đó tiếp tục thực hiện thêm một truy vấn riêng cho từng bản ghi để lấy dữ liệu liên quan. Vấn đề thường xuất hiện […]

OpenAPI và Swagger là gì?

1. OpenAPI và Swagger là gì? Khi xây dựng Backend, lập trình viên không chỉ cần triển khai API mà còn phải mô tả cách API hoạt động để những người khác có thể sử dụng và kiểm thử. Ví dụ, một ứng dụng quản lý sản phẩm cung cấp các endpoint: GET /products: lấy […]

Series 4 – React Hooks – State: Hooks, useState và useEffect

Series 4 – React Hooks – State   Bài 1 : Hooks, useState và useEffect – Quản lý dữ liệu và side effects trong React 1. React Hooks là gì? Hooks là những hàm do React cung cấp để Function Component sử dụng các khả năng như quản lý state, đồng bộ với hệ thống bên […]

Series 4 – React Fundamentals: List Rendering, Forms, Form Handling

Series 4 – React Fundamentals   Bài 3: List Rendering, Forms và Form Handling – Hiển thị danh sách và xử lý biểu mẫu trong React   1. Mở đầu Trong một ứng dụng thực tế, dữ liệu thường được hiển thị dưới dạng danh sách: danh sách sản phẩm, bài viết, người dùng hoặc công việc […]

Series 4 – React Fundamentals:  State, Events và Conditional Rendering

Series 4 – React Fundamentals   Bài 2: State, Events và Conditional Rendering – Cách React xử lý tương tác người dùng 1. Mở đầu Một giao diện website không chỉ hiển thị nội dung cố định. Khi người dùng nhấn nút, nhập dữ liệu, đăng nhập hoặc thêm sản phẩm vào giỏ hàng, giao diện cần […]

Series 4 — React Fundamentals : JSX, Components và Props – Ba nền tảng đầu tiên khi học React

Series 4 – React Fundamentals   Bài 1:JSX, Components và Props – Ba nền tảng đầu tiên khi học React 1. Mở đầu Khi xây dựng một website bằng HTML, CSS và JavaScript, chúng ta thường tạo cấu trúc giao diện bằng HTML, sau đó sử dụng JavaScript để xử lý dữ liệu và tương tác. […]

Leave a Reply

Your email address will not be published. Required fields are marked *