Cluster Index, Non-Cluster Index và Composite Index

0 0 0

Người đăng: Bảo Võ

Theo Viblo Asia

Trong bài trước, chúng ta đã tìm hiểu về Index và cấu trúc B-Tree, mục đích là giúp tăng tốc độ truy vấn, giảm số lần đọc vật lý trên ổ đĩa. Trong SQL Server có hai loại index chính:

  • Cluster Index
  • Non-Cluster Index

Ngoài ra, còn có một biến thể thường dùng trong thực tế là Composite Index (chỉ mục kết hợp nhiều cột).


Cluster Index

Ví dụ: tạo bảng Staff

CREATE TABLE Staff
( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender VARCHAR(50) NOT NULL, ranking INT NOT NULL, city_id INT NOT NULL, district_id INT NOT NULL
)

Trong lệnh trên, cột id được khai báo là PRIMARY KEY, do đó mặc định SQL Server sẽ tạo một Cluster Index trên cột này.

Kiểm tra index trong bảng:

EXECUTE sp_helpindex Staff

Một Cluster Index có tính chất sắp xếp dữ liệu theo một trật tự nhất định.

Giả dụ ta thực hiện insert 10 records và cố tình chèn thay đổi thứ tự insert dữ liệu như bên dưới

INSERT INTO Staff (id, name, gender, ranking, city_id, district_id) VALUES
(1, 'Nguyen Van A', 'Male', 1, 1, 101),
(10, 'Phan Thi J', 'Female', 1, 5, 502),
(3, 'Le Van C', 'Male', 3, 2, 201),
(4, 'Pham Thi D', 'Female', 1, 2, 202),
(6, 'Do Thi F', 'Female', 3, 3, 302),
(7, 'Vo Van G', 'Male', 1, 4, 401),
(8, 'Bui Thi H', 'Female', 2, 4, 402),
(9, 'Dang Van I', 'Male', 3, 5, 501),
(5, 'Hoang Van E', 'Male', 2, 3, 301),
(2, 'Tran Thi B', 'Female', 2, 1, 102);

Khi thực hiện:

SELECT * FROM Staff;

Kết quả trả về vẫn sắp xếp theo id tăng dần, mặc dù dữ liệu insert vào không theo thứ tự. Điều này chứng minh dữ liệu trong bảng được tổ chức vật lý dựa trên Cluster Index.

Hỏi là, một table có thể có bao nhiêu cluster index

⇒ Chỉ duy nhất 1 cluster index. Vì tính chất các dữ liệu table sẽ sắp xếp theo trật tự của clusster index nên có thể lý giải được việc này

Hỏi là, có thể tạo cluster index không phải là một primary key được không

⇒ Được, sử dụng lệnh Create CLUSTERED Index

Hỏi là, khi tạo private key mặc định cluster index được tạo theo, vậy private key có phải là cluster index không

⇒ Không. vì hoàn toàn có thể tạo một Cluster index không phải là private key


Non-Cluster Index

Ví dụ: tạo Non-Cluster Index trên cột name

CREATE INDEX idx_staff_name ON Staff (name ASC);

Kiểm tra lại:

EXECUTE sp_helpindex Staff;

Non-cluster index được lưu trữ ở một nơi khác và không làm thay đổi trật tự sắp xếp vật lý của table đó.

Ví dụ, khi tìm Staff theo name, SQL Server sẽ sử dụng Non-Cluster Index để nhanh chóng xác định vị trí, sau đó tham chiếu để lấy dữ liệu.

Hỏi là, một table có thể có bao nhiêu non-cluster index

⇒ Có nhiều non-cluster index. Tùy thuộc vào nhu cần tối ưu truy xuất dữ liệu ta sẽ đánh index theo các chiến lược khác nhau do vậy có thể tạo nhiều non-cluster index cho từng chiến lược cụ thể.

Hỏi là, khi operator xác định được key index trên non-cluster index thì nó có truy xuất ngay dữ liệu đó không

⇒ Không. Vì khi xác định được vị trí key index thì cần làm thêm một bước để tham chiếu đến địa chỉ và lấy dữ liệu. Khác với cluster index nó có thể lấy dữ liệu ra ngay.

Hôm nay chỉ nói lý thuyết phần thực hành sẽ để bài "Thực Hành Non-seekable" sẽ thấy rõ hơn việc có non-cluster index và không có non-cluster index sẽ có sự khác biệt khi lượng dữ liệu lớn


Composite Index

Ví dụ: tạo Composite Index trên nhiều cột

CREATE INDEX idx_staff_city_district
ON Staff(city_id, district_id);

Composite Index là một Non-Cluster Index trên nhiều cột. Nó đặc biệt hữu ích khi ta thường xuyên truy vấn kết hợp nhiều điều kiện.

Ví dụ truy vấn:

SELECT *
FROM Staff
WHERE city_id = 7 AND district_id = 8;

Trong trường hợp này, SQL Server có thể sử dụng Composite Index để có thể xác định vị trí không cần scan toàn bộ table giảm số lần I/O của hệ thống


Lời kết

  • Cluster Index:

    • Dữ liệu được sắp xếp vật lý.
    • Chỉ có 1 trên mỗi bảng.
    • Thường gắn với Primary Key, nhưng không bắt buộc.
    • Truy vấn nhanh hơn vì không cần Lookup.
  • Non-Cluster Index:

    • Được lưu trữ tách biệt, không ảnh hưởng tới thứ tự vật lý.
    • Có thể tạo nhiều trên cùng bảng.
    • Tìm kiếm nhanh nhưng cần bước Lookup để lấy dữ liệu đầy đủ.
  • Composite Index:

    • Là Non-Cluster Index trên nhiều cột.
    • Giúp tối ưu truy vấn nhiều điều kiện.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Stored Procedure trong SQL Server

Stored Procedure là 1 phần không thể thiếu của SQL Server. Chúng có thể hỗ trợ rất nhiều cho lập trình và cấu hình cơ sở dữ liệu.

0 0 180

- vừa được xem lúc

sử dụng index trong sql query

Index là một trong những yếu tố quan trọng nhất góp phần vào việc nâng cao hiệu suất của cơ sở dữ liệu. Index trong SQL tăng tốc độ của quá trình truy vấn dữ liệu bằng cách cung cấp phương pháp truy xuất nhanh chóng tới các dòng trong các bảng, tương tự như cách mà mục lục của một cuốn sách giúp bạn

0 0 283

- vừa được xem lúc

Hướng dẫn sửa lỗi không cài được SQL Server

Hôm qua do yêu cầu môn học, mình có cài lại Microsoft SQL Server. Trước đó mình có cài rồi, nhưng rồi lâu không dùng nên gỡ ra cho nhẹ máy. Bây giờ có dịp cần nên mình mới cài lại. Chi tiết lỗi mình gặp phải.

0 0 158

- vừa được xem lúc

Bạn nên tránh sử dụng Soft Delete khi có thể, và đây là lý do tại sao

Con người luôn luôn mắc sai lầm. Vì vậy, việc "lo xa" trước mọi tình huống xấu nhất chưa bao giờ là thừa.

0 0 224

- vừa được xem lúc

Sử dụng trigger trong SQL qua ví dụ cơ bản.

Trigger là gì . Cú pháp của Trigger. CREATE TRIGGER tên_trigger ON tên_bảng. FOR {DELETE, INSERT, UPDATE}.

0 0 179

- vừa được xem lúc

Khác biệt giữa khóa chính và khóa ngoại trong SQL

Các khoá chính và khóa ngoại là hai loại ràng buộc có thể được sử dụng để thực thi toàn vẹn dữ liệu trong các bảng SQL Server và đây là những đối tượng cơ sở dữ liệu quan trọng. Trong bài này, tôi muố

0 0 171