Clustered index là gì

     

Hẳn chúng ta cũng đã có lần nghe về 2 loại index là Clustered Index và Non-clustered index.Bạn vẫn xem: Clustered index là gì

Dạo một vòng tìm những định nghĩa bên trên Google, chắc các bạn cũng sẽ tìm kiếm được cách phân biệt dễ dàng và đơn giản đó là: Clustered index được tạo nên trên một table với primary key, còn non clustered thì dễ dàng là cho những key còn lại chưa hẳn là primary key. Câu trả lời này liệu sẽ đủ mức độ thuyết phục?

Bài viết từ bây giờ mình xin được trình làng cách hiểu của chính mình về clustered index với non-clustered index.

Bạn đang xem: Clustered index là gì

Clustered index

Vậy clustered index là gì? Liệu nó bao gồm phải dễ dàng là một số loại index được tiến công trên primary key của một table?

Clustered index tư tưởng thứ từ mà tài liệu được lưu trữ vật lý trong một bảng.

Hiểu một cách thông thường, khi bạn đánh index cho một trường trong tables, những giá trị của ngôi trường đó sẽ được tổ chức lưu trữ có cấu tạo (thông hay sẽ áp dụng B-Tree), kết quả tìm tìm trên B-Tree index sẽ trả về row pointer tới record bạn đang muốn tìm.


*

Tuy nhiên, cùng với clustered index, cục bộ row sẽ được lưu có cấu tạo ngay bên trên B-Tree index, tức là sau lúc tìm kiếm với field được đánh clustered index trên B-Tree kết quả trả về chính là record bạn muốn tìm.


*

Có một chú ý là, cục bộ dữ liệu của 1 row sẽ tiến hành lưu ngay lập tức trên node lá của B Tree, nhưng mọi node trung gian đang chỉ lưu giá trị của cột được tấn công index. Từng table chỉ nên có một clustered index, bởi vì clustered index lưu toàn thể dữ liệu trong một row và bạn không nên lưu những tài liệu này ở các nơi một lúc.

Clustered index trên InnoDB

Bởi bởi vì việc tiến hành index được phụ trách bởi các storage engines, bởi vì vậy chưa phải storage engine nào cũng support clustered index. Trong nội dung bài viết này mình sẽ nói tới việc thực hiện clustered index trong InnoDB, phần đa storage engines khác đôi lúc sẽ có các cách thực thi biệt lập tuy nhiên về nguyên tắc hoạt động thì nó vẫn sẽ giống như nhau.

Trong InnoDB, khoác định cột được đánh primary key sẽ cũng là "index column" cho bài toán clusters dữ liệu. Bởi lý do này, các bạn thường nghe nói "Clustered index được tạo ra trên một table cùng với primary key".

Tuy nhiên nếu trong một table mà bạn không tấn công primary key thì phải sử dụng cột nào để build clustered index. Câu trả lời là: InnoDB chọn column nhằm "chọn mặt gởi vàng" cho bài toán clustered index theo sản phẩm công nghệ tự ưu tiên như sau:

Đầu tiên, như đã đề cập nghỉ ngơi trên, InnoDB đã mặc định lựa chọn Primary Key làm "index column"Nếu table không có khai báo Primary key, InnoDB vẫn tìm tìm cột nào thỏa mãn nhu cầu điều kiện unique và Not null để cố thếNếu vào table đó vẫn không có cột nào quality và Not null, InnoDB sẽ sử dụng cách ở đầu cuối là từ define một hidden primary key và cluster data trên mẫu cột này.

Xem thêm: Có Một Số Tiền Nếu Mua Kẹo Loại 5000 Đồng Một Gói Thì Được 15 Gói Kẹo

Non clustered index

Với cách tàng trữ index thông thường, dữ liệu sẽ tiến hành lưu tại một vùng lưu giữ nào kia và những node lá ở đầu cuối của B Tree đang chứa bé trỏ tới đúng record mong muốn tìm. Tuy nhiên với clustered index, tài liệu được tổ chức triển khai lưu trữ tức thì trên B Tree. Primary key đó là "index column" được lựa chọn để tiến hành clusters. Vậy gần như cột còn lại khi được tiến công index nó đang lưu trữ như thế nào?

Trong InnoDB, toàn bộ những index sót lại mà không phải là clustered index thì sẽ đựng giá trị của clustered index tương ứng. Gồm nghĩa là, khi chúng ta thực hiện nay tìm kiếm với cột nonclustered index, hệ thống sẽ tìm kiếm trên B Tree index của cột đó, kết quả trả về là clustered index tương ứng, khối hệ thống sẽ liên tục quét B Tree của clustered index và trả về không thiếu thốn dữ liệu.

Giả sử bạn có một table tất cả ID, FName, LName. Trong các số ấy ID là PK, chúng ta đánh index mang lại trường FName thì InnoDB đang build 2 B Tree như sau


*

Khi thực hiện câu lệnh

select * from tables where FName = ?thì InnoDB sẽ triển khai tìm kiếm trên B Tree của FName, sau khi kiếm được node lá tương xứng thì nó liên tiếp cầm cực hiếm của node lá này (chính là key của clustered index) nhằm quét bên trên B Tree của ID (clustered index) với trả về giá bán trị tương đối đầy đủ của truy vấn.

Lưu ý khi lựa chọn cột tiến công clustered index

Việc sử dụng clustered index sẽ giúp tăng tốc độ truy cập dữ liệu. Chính vì clustered index lưu trữ index và tài liệu ngay bên trên B Tree. Record sẽ tiến hành trả về ngay sau khoản thời gian thực hiện nay quét B Tree xong xuôi thay vì buộc phải tìm kiếm mang lại row pointer như bình thường, nâng cao I/O-bound workloads.

Tuy nhiên, nếu thực hiện không đúng cách, clustered index sẽ có tác dụng performance bớt đáng kế:

Tốc độ insert vào cluster phụ thuộc vào vị trí muốn insert vào. Vì thực chất index là được lưu trữ có máy tự, khi insert 1 record mới sẽ buộc phải tìm tìm vị trí phù hợp để insert vào thay bởi vì insert vào ô ghi nhớ khả dụng tiếp theo như giải pháp thông thường.Chi giá thành cho việc cập nhật cột được tiến công clustered index sẽ rất đắt, cũng chính vì InnoDB cũng trở thành phải move toàn bộ row tương tứng mang đến vị trí mới.Table sử dụng clustered index rất có thể bị phân loại trang lúc record mới được chèn vào, hoặc khi cột được tấn công index bị cập nhật. Câu hỏi chia trang xẩy ra khi một key sau thời điểm tìm tìm đúng vị trí order phải nên chèn vào địa điểm trong page đang full data. Từ bây giờ storage engine bắt buộc chia page này thành 2, với table sẽ áp dụng nhiều space trên đĩa hơn.Chính ví việc có thể bị phân trang làm việc trên, clustered tables sẽ lừ đừ hơn khi thực hiện full table scan.Non clustered index hoàn toàn có thể sẽ phệ hơn thông thường vì node lá của chúng lưu trữ giá trị trường đoản cú clustered index, quý hiếm này càng khủng (ví dụ hình trạng varchar) thì non clustered index sẽ lớn hơn.

Vậy thì áp dụng clustered index như thế nào cho đúng nhằm tránh những tinh giảm đã nêu trên?

Câu vấn đáp là bạn nên sử dụng field tự động INCREASEMENT đến column được lựa chọn làm clustered index. Bởi vì sao? hiện thời chúng ta hãy thuộc thử so sánh việc lựa chọn một field tự động hóa INCREASEMENT cùng một field có giá trị ngẫu nhiên vừa lòng UNIQUE và NOT NULL (ví dụ UUID) có tác dụng clustered index và thuộc phân tích performance của 2 trường đúng theo này tương ứng với những giảm bớt nêu làm việc trên.

Clustered index columnAUTO INCREASEMENT columnRandom Column
Tốc độ insertKhi quý hiếm của key được đánh index tự động hóa tăng, new record chỉ việc insert vào địa điểm cuối cùng.Tìm kiếm ví trí cân xứng để chèn key với record vào
Chi phí tổn cập nhậtKhông yêu cầu thực hiện update cho cột được lựa chọn đánh clustered index nhằm tránh bài toán nàyKhông yêu cầu thực hiện update cho cột được lựa chọn đánh clustered index nhằm tránh việc này
Hạn chế phân trangVới trường tự động hóa tăng, record mới luôn được chèn vào địa điểm cuối cùng, sẽ không có trường hợp chèn vào trong những vị trí đã gồm data, nên storage engine không cần thực hiện những tác vụ phân trang lãng phíVì record mới sẽ tiến hành chèn vào ngẫu nhiên đề nghị dẫn tới bị phân trang chiếm dụng nhiều space
Giảm kích cỡ của non clustered indexThông hay trường tự động hóa tăng sẽ sở hữu kiểu dữ liệu là Number, kích thước nhỏ hơn những so với varcharnếu kiểu tài liệu là varchar càng lớn thì non clustered index sẽ đề xuất tốn những space hơn nhằm lưu phần đông giá trị này

Từ những so sánh này rất có thể thấy, khi tấn công clustered index nên chọn lựa cột UNIQUE, NOT NULL, tự động INCREASEMENT để sở hữu được tác dụng tốt nhất. Thông thường, cột có tính chất như trên chính là cột ID được khai báo là Primary Key cùng InnoDB sẽ mặc định lựa chọn nó làm clustered index column.

Xem thêm: Tìm Hiểu Tidal Là Gì ? Dịch Vụ Nghe Nhạc Trực Tuyến Chất Lượng Cao

Hi vọng qua bài viết, chúng ta hiểu rõ hơn về thực chất của clustered index núm vì cách hiểu hàn lâm thông thường là "Clustered index được tạo ra trên một table cùng với primary key".