數據庫索引b樹和b+樹區别?本節介紹索引的作用以及如何創建和維護索引,我來為大家科普一下關于數據庫索引b樹和b+樹區别?以下内容希望對你有幫助!
本節介紹索引的作用以及如何創建和維護索引。
6.2.1 索引的基本概念
在數據庫中建立索引是為了加快數據的查詢速度。數據庫中的索引與書籍中的目錄或術語表類似。在一本書中,利用目錄或術語表可以幫助讀者快速找到所需内容,而無須翻閱整本書。在數據庫中,索引使數據庫程序無須對整個表進行掃描,就可以在其中找到所需數據。書籍中的術語表是一個詞語列表,其中注明了各個詞對應的頁碼。而數據庫中的索引是一個表中某列或某些列的值列表,其中注明了列值所對應的行數據所在的存儲位置。可以為表中的單個列建立索引,也可以為一組列建立索引。索引由索引項組成,索引項由表中的一列或多列(稱為索引關鍵字)組成。索引常用的數據結構是B樹結構,B樹按索引關鍵字排序。
6.2.2 索引的分類
從數據的組織方式看,一般将索引分為兩大類:聚集索引(clustered index,也稱為聚簇索引)和非聚集索引(non-clustered index,也稱為非聚簇索引)。聚集索引對數據按索引關鍵字進行物理排序,非聚集索引不對數據進行物理排序。在SQL Server中,聚集索引和非聚集索引都采用B樹結構來存儲索引項,都包含數據頁和索引頁(索引也以數據頁為存儲分配單位),其中索引頁用于存放索引項和指向下一層的指針,數據頁用于存放數據。
1. 聚集索引
建立聚集索引後,數據庫管理系統會自動将表中的數據按聚集索引關鍵字的值進行物理排序,可以是升序也可以是降序。因此建立聚集索引後,存儲在磁盤上的表數據一定是有序的。
索引并不是建立得越多越好(建立索引需要占用空間,維護索引需要耗費時間),而是要有一些考慮因素。
下列情況可考慮創建聚集索引:
(1)包含大量非重複值的列。
(2)使用下列運算符返回一個範圍值的查詢:BETWEEN AND、>、>=、< 和 <=。
(3)經常被用于進行連接操作的列。
(4)ORDER BY或GROUP BY子句使用的列。
下列情況不适于建立聚集索引:
(1)頻繁更改的列。因為這将導緻索引項的整行移動。
(2)字節長的列。因為聚集索引的索引項值将被所有非聚集索引作為查找關鍵字使用,并被存儲在每個非聚集索引的葉級索引項中。
2. 非聚集索引
非聚集索引與圖書後邊的術語表類似。數據存儲在一個地方,術語表存儲在另一個地方。而且數據并不按術語表的順序存放,但術語表中的每個詞在書中都有确切的位置。非聚集索引就類似于術語表,而數據就類似于一本書的内容。
非聚集索引與聚集索引一樣,通常采用B樹結構存儲,但有兩個重要差别:
(1)非聚集索引的數據不按索引關鍵字值的順序排序和存儲。
(2)非聚集索引的葉節點不是存放數據的數據頁。
下述情況可考慮創建非聚集索引:
(1)包含大量非重複值的列。如果某列隻有很少的非重複值,如隻有1和0,則不對這樣的列建立非聚集索引。
(2)不返回大型結果集的查詢。
(3)經常作為查詢條件使用的列。
(4)經常作為連接和分組條件的列。
3. 唯一索引
唯一索引可以确保索引列不包含重複的值。在由多個列共同構成的唯一索引中,該索引可以确保索引列中每個值的組合都是唯一的。例如,如果在LastName和FirstName列的組合上創建了一個唯一索引FullName,則該表中任何兩個人都不可以具有完全相同的名字(LastName和FirstName均相同)。
聚集索引和非聚集索引都可以是唯一的。因此,隻要列中的數據是唯一的,就可以在一張表上創建一個唯一聚集索引和多個唯一非聚集索引。
6.2.3 創建和删除索引
1. 創建索引
創建索引使用的是CREATE INDEX 語句,其一般語法格式為:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]
INDEX 索引名 ON 表名 ( 列名[ ASC | DESC ] [,...n] )
其中:
● UNIQUE:表示要創建唯一索引。
● CLUSTERED:表示要創建聚集索引。
● NONCLUSTERED:表示要創建非聚集索引。
● [ ASC | DESC ]:指定索引列的升序或降序排序方式。默認值為ASC。
如果沒有指定索引類型,則默認是創建非聚集索引。
例1. 在Student表的Sname列上創建一個非聚集索引。
CREATE INDEX Sname_ind
ON Student (Sname)
例2. 在Student表的Sid列上創建一個唯一非聚集索引。
CREATE UNIQUE NONCLUSTERED INDEX Sid_ind
ON Student (Sid)
例3. 在Employee表的FirstName和LastName列上創建一個聚集索引。
CREATE CLUSTERED INDEX EName_ind
ON Employee (FirstName, LastName)
2. 删除索引
索引一經建立,就由數據庫管理系統自動使用和維護,不需要用戶幹預。建立索引是為了加快數據的查詢效率,但如果需要頻繁地對數據進行增加、删除和修改操作,則系統會花費很多時間來維護索引,這會降低數據的修改效率;另外,存儲索引需要占用額外的空間,這增加了數據庫的空間開銷。因此,當不需要某個索引時,應将其删除。
删除索引的SQL語句是DROP INDEX,其一般語法格式為:
DROP INDEX <索引名> ON <表名>
其中<表名>為包含要删除索引的表。
例4. 删除Student表中的Sname_ind索引。
DROP INDEX Sname_ind ON Student
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!