Sự khác biệt giữa chỉ số cụm và chỉ số không cụm là gì?


277

Sự khác biệt giữa a clusteredvà a là non-clustered indexgì?


8
Bạn chỉ có thể có một chỉ mục được nhóm trên mỗi bảng. Nhưng có nhiều sự khác biệt khác ...
Tom Robinson

5
Một chỉ mục được nhóm thực sự mô tả thứ tự mà các bản ghi được lưu trữ vật lý trên đĩa, do đó lý do bạn chỉ có thể có một. Chỉ mục không phân cụm xác định thứ tự logic không khớp với thứ tự vật lý trên đĩa.
Josh

1
Về cơ bản cụm có nghĩa là dữ liệu theo thứ tự phisical trong bảng. Đây là lý do tại sao bạn chỉ có thể có một mỗi bảng. Không bao gồm có nghĩa là "chỉ" một trật tự hợp lý.
Biri

2
@biri thứ tự "hợp lý" là gì? một chỉ mục không được nhóm lưu trữ các khóa chỉ mục theo thứ tự vật lý và nó lưu một con trỏ vào bảng, cụ thể là khóa chỉ mục được nhóm.
Stephanie Trang

@Stephanie Trang: logic theo quan điểm của bảng. Tất nhiên các chỉ mục không phân cụm được sắp xếp vật lý trong chính chỉ mục.
Biri

Câu trả lời:


268

Chỉ số cụm

  • Chỉ một bàn mỗi
  • Đọc nhanh hơn không phân cụm vì dữ liệu được lưu trữ theo thứ tự vật lý

Chỉ số không cụm

  • Có thể được sử dụng nhiều lần trên mỗi bàn
  • Nhanh hơn cho các hoạt động chèn và cập nhật hơn một chỉ mục được nhóm

Cả hai loại chỉ mục sẽ cải thiện hiệu suất khi chọn dữ liệu với các trường sử dụng chỉ mục nhưng sẽ làm chậm hoạt động cập nhật và chèn.

Do các chỉ mục phân cụm và cập nhật chậm hơn nên được đặt trên một trường thường tăng dần, tức là Id hoặc Dấu thời gian.

SQL Server thường sẽ chỉ sử dụng một chỉ mục nếu độ chọn lọc của nó trên 95%.


9
Ngoài ra còn có cân nhắc lưu trữ. Khi chèn các hàng vào một bảng không có chỉ mục được nhóm, các hàng được lưu trữ trở lại trên trang và cập nhật một hàng có thể dẫn đến hàng được di chuyển đến cuối bảng, để lại khoảng trống và phân đoạn bảng và chỉ mục.
Jeremiah Peschka

4
bạn không cần phải quan tâm x là gì. Tất cả những gì bạn cần biết là đối với một ứng dụng có hàng triệu người dùng, x sẽ rất có ý nghĩa
Pacerier

14
Đó hoàn toàn là giáo điều. Nó không "nhanh hơn để đọc vì dữ liệu được lưu theo thứ tự". Đọc nhanh hơn vì bạn tránh đọc chỉ mục VÀ THÌ bảng đã đọc. Quét phạm vi nhanh hơn (nếu điều đó có ý nghĩa) vì dữ liệu được lưu theo thứ tự. tức là yếu tố phân cụm là hoàn hảo.
Stephanie Trang

6
Ngoài ra ý tưởng rằng 95% hồ sơ cần phải là duy nhất là sai lầm. Giả sử bạn có một bảng có 1.000.000 hàng và bạn lập chỉ mục một cột có 500.000 khóa. 0% là duy nhất nhưng mỗi khóa trả về 2 trên một triệu hàng. Chỉ số này hoàn toàn hữu ích cho dù 0% hồ sơ là duy nhất.
Stephanie Trang

2
"Dữ liệu được lưu trữ theo thứ tự vật lý", ý của bạn là gì? Ở một cấp độ, điều đó là đúng vì các trang dữ liệu và các trang lá chỉ mục là một và giống nhau - vì vậy rõ ràng thứ tự của một mô tả thứ tự của cái kia. Tuy nhiên, điều này không nhất thiết phải theo bất kỳ thứ tự cụ thể nào, chẳng hạn như thứ tự của khóa chỉ số stackoverflow.com/questions/1251636/ mẹo
Martin Smith

79

Các chỉ mục được nhóm lại theo thứ tự vật lý dữ liệu trên đĩa. Điều này có nghĩa là không cần thêm dữ liệu cho chỉ mục, nhưng chỉ có thể có một chỉ mục được nhóm (rõ ràng). Truy cập dữ liệu bằng cách sử dụng một chỉ mục cụm là nhanh nhất.

Tất cả các chỉ mục khác phải không được nhóm. Một chỉ mục không được phân cụm có một bản sao dữ liệu từ các cột được lập chỉ mục được sắp xếp theo thứ tự cùng với các con trỏ tới các hàng dữ liệu thực tế (các con trỏ tới chỉ mục được phân cụm nếu có một). Điều này có nghĩa là việc truy cập dữ liệu thông qua một chỉ mục không được nhóm phải trải qua một lớp bổ sung. Tuy nhiên, nếu bạn chỉ chọn dữ liệu có sẵn trong các cột được lập chỉ mục, bạn có thể lấy lại dữ liệu trực tiếp từ dữ liệu chỉ mục trùng lặp (đó là lý do tại sao chỉ nên CHỌN các cột mà bạn cần và không sử dụng *)


3
'Tuy nhiên, nếu bạn chỉ chọn dữ liệu có sẵn trong các cột được lập chỉ mục, bạn có thể lấy lại dữ liệu trực tiếp từ dữ liệu chỉ mục trùng lặp' - vâng đó là ngoại lệ quan trọng đối với heuristic chỉ mục được nhóm. Tôi đoán trong trường hợp này về cơ bản bạn có một chỉ mục được nhóm, nhưng ít dữ liệu trong bảng bạn đang truy vấn để có khả năng nó có thể được đọc nhanh hơn khỏi đĩa.
satnhak

34

Các chỉ mục cụm được lưu trữ vật lý trên bảng. Điều này có nghĩa là chúng nhanh nhất và bạn chỉ có thể có một chỉ mục được nhóm trên mỗi bảng.

Các chỉ mục không được phân cụm được lưu trữ riêng biệt và bạn có thể có bao nhiêu tùy ý.

Tùy chọn tốt nhất là đặt chỉ mục được nhóm của bạn trên cột duy nhất được sử dụng nhiều nhất, thường là PK. Bạn phải luôn luôn có một chỉ mục cụm được chọn tốt trong các bảng của mình, trừ khi một lý do rất hấp dẫn - không thể nghĩ ra một chỉ số duy nhất, nhưng này, nó có thể ở ngoài đó - vì không làm như vậy xuất hiện.


3
bạn có thể nói rõ hơn về "chúng ta nên luôn có một chỉ mục được nhóm trong các bảng của chúng tôi" không? không cần giải thích rằng tuyên bố đó đơn giản là sai vì từ luôn luôn
Pacerier

1
Bạn đúng Pacerier, người ta không nên sử dụng các tuyên bố tuyệt đối một cách nhẹ nhàng. Mặc dù tôi không biết về một trường hợp duy nhất khi bạn không nên có một chỉ mục cụm được chọn tốt, nhưng trường hợp đó có thể tồn tại vì vậy tôi đã thay đổi câu trả lời của mình thành một phiên bản chung hơn.
Cepas

28

Chỉ số cụm

  1. Chỉ có thể có một chỉ mục được nhóm cho một bảng.
  2. Thường được thực hiện trên khóa chính.
  3. Các nút lá của một chỉ mục được nhóm chứa các trang dữ liệu.

Chỉ số không phân cụm

  1. Chỉ có thể có 249 chỉ mục không phân cụm cho một bảng (cho đến phiên bản sql 2005 phiên bản mới hơn hỗ trợ tối đa 999 chỉ mục không phân cụm).
  2. Thường được thực hiện trên bất kỳ phím nào.
  3. Nút lá của một chỉ mục không bao gồm không bao gồm các trang dữ liệu. Thay vào đó, các nút lá chứa các hàng chỉ mục.

24

Chỉ số cụm

  • Chỉ có một chỉ mục cụm có thể có trong một bảng
  • Sắp xếp các hồ sơ và lưu trữ vật lý theo thứ tự
  • Truy xuất dữ liệu nhanh hơn các chỉ mục không được phân cụm
  • Không cần thêm không gian để lưu trữ cấu trúc logic

Chỉ số không cụm

  • Có thể có bất kỳ số lượng các chỉ mục không được nhóm trong một bảng
  • Không ảnh hưởng đến trật tự vật lý. Tạo một trật tự logic cho các hàng dữ liệu và sử dụng các con trỏ tới các tệp dữ liệu vật lý
  • Chèn / cập nhật dữ liệu nhanh hơn chỉ mục cụm
  • Sử dụng thêm không gian để lưu trữ cấu trúc logic

Ngoài những khác biệt này, bạn phải biết rằng khi bảng không được phân cụm (khi bảng không có chỉ mục được phân cụm), các tệp dữ liệu không được sắp xếp và nó sử dụng cấu trúc dữ liệu Heap làm cấu trúc dữ liệu.


10

Về cơ bản cụm có nghĩa là dữ liệu theo thứ tự vật lý trong bảng. Đây là lý do tại sao bạn chỉ có thể có một mỗi bảng.

Không bao gồm có nghĩa là "chỉ" một trật tự hợp lý.


9

Ưu điểm:

Các chỉ mục được nhóm hoạt động tốt cho các phạm vi (ví dụ: chọn * từ my_table trong đó my_key nằm giữa @min và @max)

Trong một số điều kiện, DBMS sẽ không phải thực hiện công việc để sắp xếp nếu bạn sử dụng câu lệnh orderby.

Nhược điểm:

Các chỉ mục được nhóm có thể làm chậm các phần chèn vì bố trí vật lý của các bản ghi phải được sửa đổi khi các bản ghi được đưa vào nếu các khóa mới không theo thứ tự tuần tự.


6

Một chỉ mục được nhóm về cơ bản là một bản sao được sắp xếp của dữ liệu trong các cột được lập chỉ mục.

Ưu điểm chính của một chỉ mục được nhóm là khi truy vấn (tìm kiếm) của bạn định vị dữ liệu trong chỉ mục thì không cần thêm IO để truy xuất dữ liệu đó.

Chi phí hoạt động của việc duy trì một chỉ mục được nhóm, đặc biệt là trong một bảng được cập nhật thường xuyên, có thể dẫn đến hiệu suất kém và vì lý do đó, có thể nên tạo một chỉ mục không được phân cụm.


6

Một cơ sở dữ liệu được lập chỉ mục có hai phần: một tập hợp các bản ghi vật lý, được sắp xếp theo thứ tự tùy ý và một bộ chỉ mục xác định trình tự trong đó các bản ghi sẽ được đọc để mang lại kết quả được sắp xếp theo một tiêu chí nào đó. Nếu không có mối tương quan giữa sự sắp xếp vật lý và chỉ mục, thì việc đọc tất cả các bản ghi theo thứ tự có thể yêu cầu thực hiện nhiều thao tác đọc bản ghi đơn độc lập. Vì cơ sở dữ liệu có thể đọc hàng chục bản ghi liên tiếp trong thời gian ngắn hơn để đọc hai bản ghi không liên tiếp, hiệu suất có thể được cải thiện nếu các bản ghi liên tiếp trong chỉ mục cũng được lưu liên tiếp trên đĩa.

Ví dụ: nếu bắt đầu với một cơ sở dữ liệu không phân cụm trống và thêm 10.000 bản ghi theo thứ tự ngẫu nhiên, các bản ghi có thể sẽ được thêm vào cuối theo thứ tự chúng được thêm vào. Đọc cơ sở dữ liệu theo thứ tự theo chỉ mục sẽ yêu cầu 10.000 lần đọc một bản ghi. Tuy nhiên, nếu người ta sử dụng một cơ sở dữ liệu phân cụm, hệ thống có thể kiểm tra khi thêm từng bản ghi xem bản ghi trước đó có được lưu trữ không; nếu thấy rằng đó là trường hợp, nó có thể ghi bản ghi đó với bản mới ở cuối cơ sở dữ liệu. Sau đó, nó có thể xem bản ghi vật lý trước các vị trí nơi các bản ghi di chuyển được sử dụng để cư trú và xem bản ghi tiếp theo có được lưu trữ không. Nếu nó là trường hợp đó, nó có thể di chuyển bản ghi đó đến vị trí đó. Sử dụng cách tiếp cận này sẽ khiến nhiều bản ghi được nhóm lại thành từng cặp,

Trong thực tế, cơ sở dữ liệu cụm sử dụng các thuật toán phức tạp hơn so với điều này. Tuy nhiên, một điều quan trọng cần lưu ý là có sự đánh đổi giữa thời gian cần thiết để cập nhật cơ sở dữ liệu và thời gian cần thiết để đọc nó một cách tuần tự. Việc duy trì cơ sở dữ liệu phân cụm sẽ tăng đáng kể số lượng công việc cần thiết để thêm, xóa hoặc cập nhật hồ sơ theo bất kỳ cách nào có thể ảnh hưởng đến trình tự sắp xếp. Nếu cơ sở dữ liệu sẽ được đọc tuần tự thường xuyên hơn nhiều so với cơ sở dữ liệu sẽ được cập nhật, phân cụm có thể là một chiến thắng lớn. Nếu nó sẽ được cập nhật thường xuyên nhưng hiếm khi đọc theo trình tự, việc phân cụm có thể là một sự tiêu tốn hiệu năng lớn, đặc biệt là nếu chuỗi trong đó các mục được thêm vào cơ sở dữ liệu độc lập với thứ tự sắp xếp của chúng đối với chỉ mục được phân cụm.


5

Một chỉ mục được nhóm thực sự mô tả thứ tự mà các bản ghi được lưu trữ vật lý trên đĩa, do đó lý do bạn chỉ có thể có một.

Chỉ mục không phân cụm xác định thứ tự logic không khớp với thứ tự vật lý trên đĩa.


2

Bạn có thể đã trải qua phần lý thuyết từ các bài viết trên:

-Chỉ số được nhóm lại như chúng ta có thể thấy các điểm trực tiếp để ghi, tức là trực tiếp của nó để mất ít thời gian hơn cho tìm kiếm. Ngoài ra, nó sẽ không mất thêm bộ nhớ / dung lượng để lưu chỉ mục

-Trong khi, trong Chỉ mục không được phân cụm, nó gián tiếp trỏ đến Chỉ mục được phân cụm thì nó sẽ truy cập vào bản ghi thực, do tính chất gián tiếp của nó, sẽ mất thêm thời gian để truy cập. Ngoài ra, nó cần bộ nhớ / không gian riêng để lưu trữ mục lục

nhập mô tả hình ảnh ở đây


0

// Sao chép từ MSDN, điểm thứ hai của chỉ mục không phân cụm không được đề cập rõ ràng trong các câu trả lời khác.

Phân cụm

  • Các chỉ mục được nhóm sắp xếp và lưu trữ các hàng dữ liệu trong bảng hoặc dạng xem dựa trên các giá trị chính của chúng. Đây là các cột được bao gồm trong định nghĩa chỉ mục. Chỉ có thể có một chỉ mục được nhóm trên mỗi bảng, vì các hàng dữ liệu có thể được lưu trữ chỉ trong một đơn hàng.
  • Lần duy nhất các hàng dữ liệu trong một bảng được lưu theo thứ tự được sắp xếp là khi bảng chứa chỉ mục được nhóm. Khi một bảng có một chỉ mục được nhóm, bảng được gọi là bảng phân cụm. Nếu một bảng không có chỉ mục được nhóm, các hàng dữ liệu của nó được lưu trữ trong một cấu trúc không có thứ tự gọi là heap.

Không bao gồm

  • Các chỉ mục không bao gồm có cấu trúc tách biệt với các hàng dữ liệu. Một chỉ mục không bao gồm chứa các giá trị khóa chỉ mục không bao gồm và
    mỗi mục nhập giá trị khóa có một con trỏ tới hàng dữ liệu chứa giá trị khóa.
  • Con trỏ từ một hàng chỉ mục trong một chỉ mục không bao gồm đến một hàng dữ liệu được gọi là một bộ định vị hàng. Cấu trúc của bộ định vị hàng phụ thuộc vào việc các trang dữ liệu được lưu trữ trong một đống hay một bảng cụm. Đối với một đống, một bộ định vị hàng là một con trỏ đến hàng. Đối với bảng được phân cụm, bộ định vị hàng là khóa chỉ mục được nhóm.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.