Tối ưu MySQL: Index - Chìa khóa tăng tốc truy vấn (Phần 1)

Đăng ngày: 24-09-2025 06:16
mariadbDatabaseMySQLIndexTối ưu hiệu năngTruy vấnB-TreeCREATE INDEXFull Table ScanUnique Index

Chào mừng bạn đến với bài viết thứ 10 trong loạt bài về "Làm chủ MySQL & MariaDB: Từ Cơ bản đến Tối ưu". Trong bài viết này, chúng ta sẽ khám phá một trong những kỹ thuật tối ưu hóa hiệu năng quan trọng nhất: Index. Index là gì? Tại sao nó giúp truy vấn nhanh hơn? Khi nào nên và không nên tạo Index? Chúng ta sẽ cùng nhau đi sâu vào các khía cạnh này để có cái nhìn toàn diện về Index.

Index là gì?

Hãy tưởng tượng bạn đang tìm kiếm một cuốn sách trong thư viện. Nếu thư viện không có mục lục, bạn sẽ phải tìm từng cuốn một cho đến khi tìm thấy cuốn mình cần. Điều này rất mất thời gian. Index trong database cũng tương tự như mục lục của thư viện. Nó là một cấu trúc dữ liệu đặc biệt giúp database tìm kiếm dữ liệu nhanh chóng hơn.

Index chứa các giá trị của một hoặc nhiều cột trong bảng và con trỏ đến các hàng tương ứng. Khi bạn thực hiện một truy vấn sử dụng các cột đã được index, database có thể sử dụng index để nhanh chóng tìm thấy các hàng thỏa mãn điều kiện tìm kiếm mà không cần phải quét toàn bộ bảng.

Tại sao Index giúp truy vấn nhanh hơn?

Khi không có index, database phải thực hiện một "full table scan", nghĩa là nó phải đọc mọi hàng trong bảng để tìm kiếm các hàng thỏa mãn điều kiện truy vấn. Điều này rất tốn thời gian, đặc biệt đối với các bảng lớn.

Khi có index, database có thể sử dụng index để nhanh chóng tìm thấy các hàng cần thiết. Thay vì quét toàn bộ bảng, nó chỉ cần quét một phần nhỏ của index, sau đó sử dụng con trỏ để truy cập trực tiếp đến các hàng tương ứng. Điều này giúp giảm đáng kể thời gian truy vấn.

Khi nào nên và không nên tạo Index?

Việc tạo index không phải lúc nào cũng là một ý tưởng tốt. Mặc dù index giúp tăng tốc truy vấn, nhưng nó cũng có một số nhược điểm. Index chiếm dung lượng lưu trữ và làm chậm các thao tác ghi (INSERT, UPDATE, DELETE). Do đó, bạn cần phải cân nhắc kỹ lưỡng trước khi tạo index.

Khi nào nên tạo Index:

  • Các cột được sử dụng thường xuyên trong mệnh đề WHERE: Nếu bạn thường xuyên sử dụng một cột nào đó trong mệnh đề WHERE của các truy vấn, thì việc tạo index trên cột đó có thể cải thiện đáng kể hiệu năng truy vấn.
  • Các cột được sử dụng trong mệnh đề JOIN: Index trên các cột được sử dụng trong mệnh đề JOIN có thể giúp tăng tốc các truy vấn JOIN.
  • Các cột có tính chọn lọc cao: Tính chọn lọc của một cột là tỷ lệ giữa số lượng giá trị duy nhất và tổng số hàng trong bảng. Các cột có tính chọn lọc cao (ví dụ: cột ID) là những ứng cử viên tốt cho việc tạo index.

Khi nào không nên tạo Index:

  • Các bảng nhỏ: Đối với các bảng nhỏ, việc tạo index có thể không mang lại nhiều lợi ích, thậm chí còn có thể làm chậm truy vấn.
  • Các cột được cập nhật thường xuyên: Index làm chậm các thao tác ghi. Nếu một cột được cập nhật thường xuyên, việc tạo index trên cột đó có thể gây ra hiệu năng không mong muốn.
  • Các cột có tính chọn lọc thấp: Các cột có tính chọn lọc thấp (ví dụ: cột giới tính) thường không phải là những ứng cử viên tốt cho việc tạo index.
  • Các cột được sử dụng trong mệnh đề WHERE với các hàm: Nếu bạn sử dụng một cột trong mệnh đề WHERE với một hàm (ví dụ: WHERE UPPER(column) = 'VALUE'), index trên cột đó có thể không được sử dụng.

Các loại Index cơ bản (B-Tree)

Trong MySQL và MariaDB, loại index phổ biến nhất là B-Tree index. B-Tree là một cấu trúc dữ liệu cây cân bằng, cho phép tìm kiếm, chèn và xóa dữ liệu một cách hiệu quả. B-Tree index phù hợp với nhiều loại truy vấn, bao gồm tìm kiếm chính xác, tìm kiếm theo khoảng và tìm kiếm theo tiền tố.

Ngoài B-Tree index, MySQL và MariaDB còn hỗ trợ một số loại index khác, như Hash index, Fulltext index và Spatial index. Tuy nhiên, B-Tree index là loại index phổ biến nhất và thường được sử dụng mặc định.

Cú pháp CREATE INDEX

Để tạo index trong MySQL và MariaDB, bạn sử dụng câu lệnh CREATE INDEX. Cú pháp cơ bản của câu lệnh CREATE INDEX như sau:

CREATE INDEX index_name
ON table_name (column1, column2, ...);

Ví dụ, để tạo index trên cột `email` trong bảng `users`, bạn có thể sử dụng câu lệnh sau:

CREATE INDEX idx_email
ON users (email);

Bạn cũng có thể tạo index UNIQUE để đảm bảo rằng các giá trị trong cột được index là duy nhất:

CREATE UNIQUE INDEX idx_email
ON users (email);

Để xóa index, bạn sử dụng câu lệnh DROP INDEX:

DROP INDEX index_name ON table_name;

Ví dụ:

DROP INDEX idx_email ON users;

Kết luận

Index là một công cụ mạnh mẽ để tối ưu hóa hiệu năng truy vấn trong MySQL và MariaDB. Tuy nhiên, việc sử dụng index một cách hiệu quả đòi hỏi sự hiểu biết về cách thức hoạt động của index và các yếu tố ảnh hưởng đến hiệu năng truy vấn. Hãy cân nhắc kỹ lưỡng trước khi tạo index và luôn theo dõi hiệu năng truy vấn để đảm bảo rằng index đang mang lại lợi ích thực sự. Hãy tiếp tục theo dõi các bài viết tiếp theo trong loạt bài "Làm chủ MySQL & MariaDB" để khám phá thêm nhiều kỹ thuật tối ưu hóa hiệu năng khác.

0 Bình luận