0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Tối ưu hóa cơ sở dữ liệu: Chỉ mục (Indexing)

Đăng vào 4 tuần trước

• 5 phút đọc

📑 Mục lục – Tối ưu hóa cơ sở dữ liệu: Chỉ mục

  • Giới thiệu
  • Chỉ mục là gì?
  • Cách truy vấn hoạt động mà không có chỉ mục
  • Cách chỉ mục hoạt động
  • Các loại chỉ mục
    • Chỉ mục cột đơn
    • Chỉ mục tổ hợp (nhiều cột)
    • Chỉ mục duy nhất
    • Chỉ mục toàn văn
    • Chỉ mục phân cụm và không phân cụm
  • Khi nào chỉ mục có lợi
  • Khi nào chỉ mục có hại
  • Ví dụ thực tế: Tìm kiếm thương mại điện tử
  • Thực tiễn tốt nhất
  • Tóm tắt

🚀 Tối ưu hóa cơ sở dữ liệu: Chỉ mục (Indexing)

Cơ sở dữ liệu là xương sống của các ứng dụng hiện đại, cung cấp sức mạnh cho mọi thứ từ trang web thương mại điện tử đến hệ thống ngân hàng. Tuy nhiên, khi khối lượng dữ liệu tăng lên, việc truy xuất bản ghi một cách hiệu quả trở thành một thách thức. Một trong những kỹ thuật tối ưu hóa cơ bản nhất là Chỉ mục.

Bài viết này sẽ hướng dẫn bạn qua từng bước của việc chỉ mục — bắt đầu từ các khái niệm cơ bản và dần dần chuyển sang cách sử dụng trong thực tế với các ví dụ SQL.


Chỉ mục là gì?

Hãy tưởng tượng một cơ sở dữ liệu giống như một cuốn sách khổng lồ và mỗi hàng là một trang. Nếu bạn muốn tìm một từ trong cuốn sách mà không có chỉ mục, bạn sẽ phải quét từng trang — đây gọi là quét toàn bộ bảng.

Nhưng nếu cuốn sách có một chỉ mục ở phía sau, bạn có thể nhảy trực tiếp đến số trang.
👉 Tương tự, một chỉ mục cơ sở dữ liệu là một cấu trúc dữ liệu giúp cơ sở dữ liệu nhanh chóng xác định các hàng phù hợp với điều kiện truy vấn.


Cách truy vấn hoạt động mà không có chỉ mục

Giả sử chúng ta có một bảng nhân viên:

Copy
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Name VARCHAR(100),
    Department VARCHAR(50),
    Salary INT
);

INSERT INTO Employees VALUES
(1, 'Alice', 'HR', 50000),
(2, 'Bob', 'IT', 60000),
(3, 'Charlie', 'Finance', 55000),
(4, 'David', 'IT', 65000),
(5, 'Eva', 'HR', 52000);

Bây giờ, nếu chúng ta thực hiện:

Copy
SELECT * FROM Employees WHERE Department = 'IT';

Mà không có chỉ mục, cơ sở dữ liệu sẽ:

  1. Quét từng hàng trong Employees.
  2. So sánh cột Department với "IT".
  3. Trả về các hàng phù hợp.

Nếu Employees10 triệu hàng, điều này sẽ rất chậm!


Cách chỉ mục hoạt động

Bằng cách tạo một chỉ mục trên cột Department:

Copy
CREATE INDEX idx_department ON Employees(Department);

Bây giờ, cơ sở dữ liệu tạo ra một cấu trúc riêng biệt (thường là một B-Tree hoặc Hash Map) mà ánh xạ mỗi phòng ban đến vị trí hàng.

Khi chúng ta truy vấn cho "IT", DB sẽ nhảy trực tiếp đến chỉ mục → lấy các hàng → bỏ qua việc quét các hàng không cần thiết.


Các loại chỉ mục (Cùng ví dụ)

Chỉ mục cột đơn

Chỉ mục được tạo trên một cột.

Copy
CREATE INDEX idx_salary ON Employees(Salary);

Sử dụng cho:

Copy
SELECT * FROM Employees WHERE Salary > 60000;

Chỉ mục tổ hợp (nhiều cột)

Chỉ mục được tạo trên nhiều cột.

Copy
CREATE INDEX idx_dept_salary ON Employees(Department, Salary);

Điều này giúp với các truy vấn như:

Copy
SELECT * FROM Employees WHERE Department = 'IT' AND Salary > 60000;

⚠️ Quy tắc: Thứ tự là quan trọng!

  • Chỉ mục (Department, Salary) hoạt động cho các truy vấn lọc theo Department hoặc cả hai.
  • Nhưng nếu bạn chỉ lọc theo Salary, chỉ mục có thể không được sử dụng hiệu quả.

Chỉ mục duy nhất

Đảm bảo tất cả các giá trị trong một cột là duy nhất.

Copy
CREATE UNIQUE INDEX idx_email ON Employees(Name);

Nếu bạn cố gắng chèn một giá trị trùng lặp, nó sẽ thất bại.


Chỉ mục toàn văn

Sử dụng để tìm kiếm các trường văn bản lớn.

Copy
CREATE FULLTEXT INDEX idx_name ON Employees(Name);

Truy vấn:

Copy
SELECT * FROM Employees WHERE MATCH(Name) AGAINST('Alice');

Chỉ mục phân cụm và không phân cụm

  • Chỉ mục phân cụm: Sắp xếp lại các hàng thực tế của bảng để phù hợp với thứ tự chỉ mục. (Chỉ có một trên mỗi bảng, thường là khóa chính).
  • Chỉ mục không phân cụm: Tạo một cấu trúc chỉ mục riêng biệt mà trỏ đến vị trí hàng.

Ví dụ trong SQL Server:

Copy
-- Chỉ mục phân cụm trên EmployeeID
CREATE CLUSTERED INDEX idx_empid ON Employees(EmployeeID);

-- Chỉ mục không phân cụm trên Department
CREATE NONCLUSTERED INDEX idx_dept ON Employees(Department);

Khi nào chỉ mục có lợi

✅ Tìm kiếm nhanh với các điều kiện WHERE
✅ Tăng tốc độ các phép toán JOIN
✅ Sắp xếp hiệu quả với ORDER BY
✅ Tra cứu nhanh cho các ràng buộc duy nhất


Khi nào chỉ mục có hại

❌ Chiếm thêm không gian đĩa
❌ Làm chậm INSERT, UPDATE, DELETE (vì các chỉ mục cũng phải được cập nhật)
❌ Quá nhiều chỉ mục → nhầm lẫn cho bộ tối ưu truy vấn


Ví dụ thực tế: Tìm kiếm thương mại điện tử

Hãy tưởng tượng một bảng Orders với hàng triệu hàng:

Copy
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    ProductID INT,
    OrderDate DATE,
    Status VARCHAR(20)
);

Truy vấn:

Copy
SELECT * FROM Orders WHERE CustomerID = 101 AND Status = 'Shipped';

👉 Mà không có chỉ mục: quét toàn bộ bảng.
👉 Với chỉ mục tổ hợp:

Copy
CREATE INDEX idx_customer_status ON Orders(CustomerID, Status);

Bây giờ, kết quả sẽ xuất hiện ngay lập tức.


Thực tiễn tốt nhất

  • Chỉ mục các cột thường xuyên được sử dụng trong WHERE, JOIN, ORDER BY, GROUP BY.
  • Không chỉ mục cho các bảng nhỏ (quét toàn bộ nhanh hơn).
  • Tránh chỉ mục cho các cột có tần suất cập nhật cao.
  • Giám sát với EXPLAIN (MySQL/PostgreSQL) hoặc EXPLAIN PLAN (Oracle) để xem liệu các chỉ mục có được sử dụng hay không.

Tóm tắt

  • Chỉ mục cải thiện hiệu suất truy vấn bằng cách tránh quét toàn bộ bảng.
  • Các loại chỉ mục khác nhau (cột đơn, tổ hợp, phân cụm, toàn văn) phù hợp với các nhu cầu khác nhau.
  • Quá nhiều chỉ mục có thể gây hại cho hiệu suất, vì vậy cần cân bằng.

👉 Hãy coi việc chỉ mục giống như một thư mục thư viện — nó không miễn phí để duy trì, nhưng nó tiết kiệm cho bạn rất nhiều thời gian khi tìm kiếm.


Chi tiết hơn:

Nhận tất cả các bài viết liên quan đến thiết kế hệ thống
Hastag: SystemDesignWithZeeshanAli

systemdesignwithzeeshanali

Git: https://github.com/ZeeshanAli-0704/SystemDesignWithZeeshanAli

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào