1. 程式人生 > >聚集索引和非聚集索引的根本區別

聚集索引和非聚集索引的根本區別

根本區別

聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致。

聚集索引

聚集索引表記錄的排列順序和索引的排列順序一致,所以查詢效率快,只要找到第一個索引值記錄,其餘就連續性的記錄在物理也一樣連續存放。聚集索引對應的缺點就是修改慢,因為為了保證表中記錄的物理和索引順序一致,在記錄插入的時候,會對資料頁重新排序。

非聚集索引

非聚集索引制定了表中記錄的邏輯順序,但是記錄的物理和索引不一定一致,兩種索引都採用B+樹結構,非聚集索引的葉子層並不和實際資料頁相重疊,而採用葉子層包含一個指向表中的記錄在資料頁中的指標方式。非聚集索引層次多,不會造成資料重排。

例子對比兩種索引

聚集索引就類似新華字典中的拼音排序索引,都是按順序進行,例如找到字典中的“愛”,就裡面順序執行找到“癌”。而非聚集索引則類似於筆畫排序,索引順序和物理順序並不是按順序存放的。

索引建立Demo

create database IndexDemo 
go 
use IndexDemo 
go 

create table ABC 
( 
A int not null, 
B char(10), 
C varchar(10) 
) 
go 
insert into ABC select 1,'B','C' 
union select 5,'B','C' 
union select 7,'B','C' 
union select 9,'B','C' 
go select * from abc

這個時候查看錶記錄,如圖一顯示
在這裡插入圖片描述
這個時候插入一條資料,

insert into abc values('6','B','C')

此時的查詢記錄為圖二展示
在這裡插入圖片描述
新增聚集索引,再查詢資料顯示為圖三,此時發現表的順序發生了變化,此時的排序按A欄位的遞增排序。

create clustered index CLU_ABC on abc(A) 

在這裡插入圖片描述
刪除聚集索引,會發現表的順序不會發生改變。

drop index abc.CLU_ABC

新增非聚集索引,新增新的記錄,查看錶順序,如圖四,並沒有影響表的順序。

create nonclustered index NONCLU_ABC on abc(A) 
insert into abc values('4','B','C')

在這裡插入圖片描述


原文:https://blog.csdn.net/jiadajing267/article/details/54581262