Non-clustered index là gì
Video hướng dẫn:
Tổng quan
Giả sử bạn có một cuốn sách SQL và bạn muốn tìm phần kiến thức nói về GROUP BY, bạn có thể sử dụng hai cách, thứ nhất bạn bạn có thể tìm từ đầu đến cuối (hoặc từ cuối lên đầu) cuốn sách, thứ hai bạn tìm đến phần mục lục của cuốn sách rồi tra xem mục bạn muốn xem nằm ở trang nào.
Rõ ràng cách thứ hai sẽ khoa học và tốn ít thời gian tìm kiếm hơn cách thứ nhất, INDEX (hay Chỉ mục)tương tự như cách thứ hai.
Mỗi bảng trong SQL có thể được ví như một cuốn sách, mỗi bản ghi (hàng dữ liệu) của bảng có thể coi như một trang sách.INDEX sẽ có nhiệm vụlập chỉ mục cho bảng.
Bạn biết rằng các bản ghi trong một bảng được lưu trữ theo thứ tự mà chúng được chèn (INSERT) vào bảng, trong đó bản ghi được chèn vào trước sẽ có vị trí trước, bản ghi được chèn vào sau có vị trí sau; có nghĩa rằng các bản ghi trong bảng không được sắp xếp, nếu vậy khi truy xuất dữ liệu (tìm kiếm) từ bảng thì hệ thống phải quét (scan) trên toàn bộ bảng, và điều này sẽ làm giảm đi tốc độ truy xuất dữ liệu.
Nhưng khi bạn tạo chỉ mục (index) cho bảng thì lại khác, index sẽ tiến hành tạo một thứ tự cho các bản ghi của bảng, và điều này sẽ giúp làm tăng tốc độ truy xuất dữ liệu.
Lưu ý
+ Bạn không nên tạo index nếu nó không được sử dụng thường xuyên, bởi vì để duy trì nó sẽ phải mất thời gian cũng như tài nguyên lưu trữ.
Cấu trúc INDEX
Cấu trúc Cây nhị phân (Binary-tree = B-tree):
Cấu trúc INDEX dạng B-tree:
Vềphân loại thì ta có hai loạiINDEXcơ bản là Clustered Index và Nonclustered Index. Hai loại INDEX này được trình bày chi tiết dưới đây.
Clustered Index
Clustered Index sẽ tiến hành lưu trữ các bản ghi của bảng ở mức vật lý rồi tiến hành sắp xếp chúng, nó thường áp dụng cho bảng chứa một lượng bản ghi lớn. Dữ liệu được lưu trữ theo cách sắp xếp trên khóa clustered vàmỗi nút lá (leaf) của clustered index chứa một bản ghi.
Các đặc điểm sau đây cần lưu ý khi sử dụng Clustered Index:
- Mỗi bảng chỉ được phép có một Clustered Index.
- Khóa chính (Primary Key - PK) chính là mộtClustered Index.
- Clustered Index chỉ được tạo trên cột hoặc tập cột có chứa những giá trị hoặc tập giá trị duy nhất.
Giả sử ta có bảngStudentgồm các cột sau: studentid (mã sinh viên), studentname (họ và tên), dateofbirth (ngày sinh), vàemail (email của sinh viên).Nếu bảng Student đã có PK thì bạn không thể tạo đượcClustered Index trên nó vì PK chính làClustered Index, muốn tạo bạn phải xóa PK. Nếu Student không có PK bạn có thể tạo đượcClustered Index trên bảng này, nhưng nếu bạn định tạo trên cột studentname thì bạn cần xem lại vì cột này có thể có chứa nhiều sinh viên trùng tên; bạn có thể đặtClustered Index trên cột email hoặc studentid là những cột chỉ chứa những giá trị duy nhất.
Cú pháp tạo Clustered Index như sau:
Ví dụ,nếu bảng Student chưa có PK, ta thiết lậpClustered Index cho nó như sau:
Nonclustered Index
Nonclustered Index được định nghĩa trên bảng trong đó dữ liệu có thể có cấu trúc phân cụm (clustered structure) hoặc ở dạng vun đống (heap).
Mỗi hàng index trong Nonclustered Index sẽ chứa một giá trị khóa nonclustered và một bộ định vị hàng.
Nonclustered Index thường áp dụng cho bảng chứa một lượng bản ghi nhỏ;một bảng có thể có nhiều Nonclustered Index.
Dữ liệu được lưu trữ theo cách sắp xếp trên khóa nonclustered vàmỗi nút lá (leaf) của Nonclustered Index chứa một bản ghi.
Cú pháp tạo Nonclustered Index
Hoặc:
Ví dụ, để tạoNonclustered Index cho cột studentname của bảng Student, ta làm như sau:
Hoặc:
Để tạoNonclustered Index cho các cột studentname và dateofbirth của bảng Student, ta làmnhư sau:
Hoặc:
Unique Index
Unique Index hayUnique Nonclustered Index dùng để tạo chỉ mục trên cột hay tập cột chứa những giá trị hoặc tập giá trị duy nhất.
Lưu ý:Khi đã tạoUnique Index trên cột hay tập cột của bảng thì sau đó bạn sẽ không thể chèn (INSERT) vào bảng này bản ghi có giá trị hay tập giá trị giống với bất kỳ giá trị hay tập giá trị đã được chèn trước đó.
Cú pháp:
Hoặc:
Ví dụ,với bảng Student ở trên ta thấy rằng cột studentemail là cột chứa những email của sinh viên, những email này là duy nhất, tức là không có email giống nhau. Như vậy ta có thể tạoUnique Index trên cột này. Ta làm như sau:
Hoặc:
Xoá Index
Để xoá Index ta sử dụng câu lệnh DROP INDEX. Đoạn mã dưới đây sẽ tiến hành xóacác index tương ứngcủa bảng Student:
Xem thông tin Index
Nếu bạn muốn biết xem một bảng nào đó có những Index nào và thông tin cụ thể của nó ra sao bạn sử dụng sp_helpindex theo cú pháp sau:
Ví dụ: