Covering Index là gì? Kỹ thuật tăng tốc truy vấn cực mạnh trong Database

Khi tối ưu SQL, nhiều lập trình viên thường nghĩ chỉ cần tạo INDEX là truy vấn sẽ nhanh. Nhưng thực tế, có những trường hợp database vẫn phải đọc thêm dữ liệu từ table dù đã dùng INDEX. Đây cũng là lúc khái niệm Covering Index trở nên cực kỳ quan trọng.

Covering Index là gì? Kỹ thuật tăng tốc truy vấn cực mạnh trong Database

Covering Index là một kỹ thuật tối ưu truy vấn giúp database lấy toàn bộ dữ liệu cần thiết trực tiếp từ INDEX mà không cần quay lại đọc table gốc. Điều này giúp giảm số lần truy cập ổ đĩa, tăng tốc độ query đáng kể và tối ưu hiệu năng cho hệ thống dữ liệu lớn.

Covering Index là gì?

Covering Index là một INDEX chứa đầy đủ tất cả column cần thiết cho câu truy vấn.

Nói cách khác, nếu database có thể tìm thấy:

  • Column trong WHERE
  • Column trong SELECT
  • Column trong ORDER BY
  • Column trong GROUP BY

đều nằm bên trong INDEX, thì database sẽ không cần đọc thêm dữ liệu từ table thật nữa.

Đây được gọi là:

Using index

trong MySQL EXPLAIN.

Vì sao Covering Index nhanh hơn?

Thông thường khi query bằng INDEX, database sẽ thực hiện 2 bước:

  • Tìm vị trí dữ liệu trong INDEX
  • Quay lại table để đọc dữ liệu thật

Quá trình quay lại table này thường được gọi là:

Bookmark Lookup
Table Lookup
Back to Table

Đây là thao tác khá tốn chi phí, đặc biệt khi query hàng triệu record.

Covering Index giúp loại bỏ hoàn toàn bước này.

Ví dụ Covering Index

Giả sử có bảng users:

CREATE TABLE users (
    id BIGINT PRIMARY KEY,
    username VARCHAR(100),
    email VARCHAR(255),
    created_at DATETIME
);

Tạo INDEX:

CREATE INDEX idx_username_email
ON users(username, email);

Query:

SELECT username, email
FROM users
WHERE username = 'admin';

Trong trường hợp này:

  • WHERE dùng username
  • SELECT lấy username và email
  • Tất cả đều nằm trong INDEX

Database chỉ cần đọc INDEX mà không cần đọc table users.

Khi nào query không phải Covering Index?

Ví dụ:

SELECT username, email, created_at
FROM users
WHERE username = 'admin';

Lúc này:

  • INDEX chỉ có username và email
  • created_at không nằm trong INDEX

Database buộc phải quay lại table để lấy created_at.

Đây không còn là Covering Index nữa.

Covering Index trong MySQL EXPLAIN

Khi dùng EXPLAIN:

EXPLAIN SELECT username, email
FROM users
WHERE username = 'admin';

Nếu query dùng Covering Index, cột Extra thường hiển thị:

Using index

Đây là dấu hiệu rất tốt về hiệu năng.

Vì sao Covering Index cực kỳ quan trọng?

Database thường lưu table và INDEX ở các block dữ liệu khác nhau trên ổ đĩa.

Nếu query phải:

  • Đọc INDEX
  • Sau đó đọc lại table

thì số lần I/O sẽ tăng lên rất nhiều.

Covering Index giúp:

  • Giảm Disk I/O
  • Giảm Random Access
  • Tăng tốc truy vấn
  • Tăng throughput hệ thống
  • Giảm tải database server

Covering Index đặc biệt hiệu quả với query nào?

Covering Index hoạt động rất mạnh với:

  • Query đọc nhiều
  • API list dữ liệu
  • Dashboard
  • Pagination
  • Report
  • Search dữ liệu

Ví dụ:

SELECT id, title
FROM posts
WHERE status = 'published'
ORDER BY created_at DESC
LIMIT 20;

Nếu INDEX chứa:

(status, created_at, id, title)

thì query có thể chạy cực nhanh.

Composite Index và Covering Index

Covering Index thường đi cùng Composite Index.

Ví dụ:

CREATE INDEX idx_posts
ON posts(status, created_at, id, title);

INDEX này vừa:

  • Filter bằng status
  • Sort bằng created_at
  • Trả về id và title

Toàn bộ query được xử lý chỉ bằng INDEX.

Nhược điểm của Covering Index

Dù rất mạnh, Covering Index không phải lúc nào cũng tốt.

Nếu thêm quá nhiều column vào INDEX:

  • INDEX sẽ lớn hơn
  • Tốn RAM hơn
  • Insert chậm hơn
  • Update chậm hơn
  • Disk usage tăng lên

Đây là trade-off rất quan trọng trong thiết kế database.

Khi nào nên dùng Covering Index?

Nên dùng khi:

  • Query chạy cực nhiều
  • Read-heavy system
  • API cần tốc độ cao
  • Dashboard truy cập liên tục
  • Dữ liệu lớn

Không nên lạm dụng cho mọi query nhỏ.

Covering Index và InnoDB

Trong MySQL InnoDB, secondary index thường phải quay về clustered index để lấy dữ liệu thật.

Điều này khiến Covering Index càng quan trọng hơn vì nó giúp tránh bước truy cập bổ sung này.

Đây cũng là lý do nhiều hệ thống lớn tối ưu rất mạnh các query hot bằng Covering Index.

Kết luận

Covering Index là một trong những kỹ thuật tối ưu database hiệu quả nhất hiện nay. Thay vì chỉ dùng INDEX để tìm vị trí dữ liệu, Covering Index cho phép database xử lý toàn bộ query trực tiếp trên INDEX mà không cần đọc table thật.

Nếu hiểu và áp dụng đúng Covering Index, lập trình viên có thể cải thiện hiệu năng query cực lớn, đặc biệt trong các hệ thống nhiều traffic và dữ liệu khổng lồ.

Bình luận


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...