Chỉ mục theo nhóm là một loại chỉ mục trong đó các bản ghi trong bảng được sắp xếp theo trường được lập chỉ mục. Khi một bảng được tạo với một chỉ mục được phân cụm, bản thân nó sẽ trở thành một cây chỉ mục, với các nút lá chứa các khóa là trường chỉ mục và tất cả các trường còn lại của bảng.
Bởi vì các bản ghi chỉ có thể được sắp xếp theo một thứ tự nhất định trên cây chỉ mục, mỗi bảng chỉ có thể có nhiều nhất một chỉ mục nhóm. Bạn tạo một chỉ mục theo nhóm như sau:
Tạo chỉ mục theo nhóm index_name trên dbo.tblname (colname1, colname2 …)
Khi bảng có chỉ mục được phân nhóm , các chỉ mục khác (chỉ mục không được phân nhóm) sẽ sử dụng khóa của trường chỉ mục được phân nhóm làm con trỏ để trỏ đến bản ghi tương ứng (nếu bảng không có một chỉ mục được phân cụm, sử dụng giá trị id nội bộ giá trị).
Chỉ mục được nhóm không cần phải là duy nhất. Nhưng khi nó không phải là duy nhất, khóa chỉ mục được thêm vào với giá trị 4 byte ngẫu nhiên để đảm bảo rằng inode vẫn là duy nhất.
Mục đích của việc này là để các con trỏ trong các chỉ mục khác luôn trỏ đến chỉ một bản ghi, sau đó con trỏ sẽ bao gồm khóa chỉ mục + một chuỗi 4 byte bổ sung.
Phần bổ sung này làm tăng kích thước của chỉ mục được nhóm cũng như các chỉ mục khác, vì vậy trong hầu hết các trường hợp thực tế, bạn nên tạo một chỉ mục được nhóm duy nhất. Trên thực tế, theo mặc định, một chỉ mục nhóm duy nhất được tạo khi khóa chính được khai báo.
Tìm kiếm theo trường bằng cách sử dụng chỉ mục theo nhóm được tối ưu hóa hơn chỉ mục không theo nhóm vì nó bỏ qua bước tra cứu dấu trang (vì tất cả các trường dữ liệu đã có sẵn ở chỉ mục nút).
Mẹo khi chọn trường chỉ mục theo nhóm
Do các đặc điểm nêu trên của chỉ mục nhóm, bạn cần lưu ý những điểm sau khi chọn trường làm chỉ mục nhóm để có hiệu suất tối ưu.
Một ứng cử viên cho chỉ mục theo nhóm phải đáp ứng các điều kiện sau:
Kích thước nhỏ : Nói chung đối với bất kỳ loại chỉ mục nào, bạn cũng nên chọn các trường nhỏ để giảm kích thước của chỉ mục. Đối với các chỉ mục được phân cụm, tiêu chí này thậm chí còn quan trọng hơn vì các khóa của nó được sử dụng làm con trỏ tới các bản ghi trong tất cả các chỉ mục (không phân cụm) khác trên bảng. Ví dụ: các trường varchar (100) hoặc các trường có kiểu dữ liệu gần đúng như float có thể cần được xem xét lại. Trường số nguyên (int hoặc bigint) là tốt nhất, vì tìm kiếm theo số nguyên luôn nhanh hơn tìm kiếm theo chuỗi. Mặc dù các chỉ mục được phân nhóm cho phép nhiều trường (chỉ mục ghép), bạn chỉ nên sử dụng một trường, cũng để giữ cho kích thước chỉ mục nhỏ.
Trường Luôn Tăng : Vì các giá trị mới cho các trường chỉ mục được nhóm luôn tăng lên, các bản ghi mới sẽ luôn được thêm vào cuối bảng. Nếu có bất kỳ thay đổi nào trong giá trị này, các bản ghi mới có thể được chèn vào giữa bảng. Điều này dẫn đến phân mảnh dữ liệu, nơi các bản ghi nằm liền kề nhau một cách logic nhưng không liền kề nhau (được lưu trữ trong các trang khác nhau). Sự phân mảnh giúp hệ thống đọc dữ liệu dễ dàng hơn, đặc biệt khi một loạt các bản ghi cần được truy xuất.
Trường tĩnh: Các trường chỉ mục theo cụm không được cập nhật thường xuyên và giá trị của chúng phải tồn tại khi chúng xuất hiện trong bảng. Khi cập nhật, bản thân chỉ mục được phân cụm cần được cập nhật để sắp xếp các bản ghi đến vị trí mới theo đúng thứ tự và các chỉ mục không được phân cụm khác cũng phải được cập nhật để con trỏ bây giờ chứa giá trị. Do đó, việc cập nhật một trường chỉ mục được phân cụm là rất tốn kém và nếu nó được cập nhật thường xuyên, nó cũng có thể khiến chỉ mục được phân nhóm trở nên phân mảnh.
Trong nhiều trường hợp, cột nhận dạng phù hợp với chỉ mục nhóm vì nó đáp ứng tất cả các yêu cầu trên: kích thước nhỏ (kiểu int hoặc bigint), luôn tăng và tĩnh (tại chỗ). Sau đó chèn bạn không quan tâm nhiều đến giá trị của nó và hiếm khi cần cập nhật). Trước tiên, bạn có thể sử dụng cột nhận dạng làm chỉ mục theo nhóm, sau đó chuyển sang trường khác nếu cảm thấy không ổn.
Tôi hy vọng rằng thông qua bài viết này, bạn sẽ hiểu rõ hơn về các chỉ mục được phân nhóm và có thể chọn cách tốt nhất để lập chỉ mục.