1. 程式人生 > >數據庫系統概論-[04]索引

數據庫系統概論-[04]索引

主動 主鍵 where 平衡 內模式 b+ 優先級 刪除數據 然而

1、索引概述

建立索引是加快查詢速度的有效手段,用戶能夠依據應用環境的須要。在基本表上建立一個或者多個索引,以提供多種存取路徑,加快查找速度。

一般來說,建立與刪除索引由數據庫管理員DBA或者表的屬主(owner),即建立表的人負責完畢,系統在存取數據時會自己主動選擇合適的索引作為存取路徑,用戶不必也不能顯示地選擇索引。


2、索引長處和缺點

首先明確為什麽創建索引,由於創建索引能夠大大提高系統的性能。

  • 通過創建唯一性索引,能夠保證數據庫表中每一行數據的唯一性。
  • 能夠大大加快數據的檢索速度,這也是創建索引的最基本的原因。

  • 能夠加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
  • 在使用分組和排序子句進行數據檢索時,相同能夠顯著降低查詢中分組和排序的時間。
  • 通過使用索引。能夠在查詢的過程中。使用優化隱藏器,提高系統的性能。

添加索引有如此多的長處,為什麽不正確表中的每個列創建一個索引呢?這樣的想法固然有其合理性,然而也有其片面性,盡管索引有很多的長處,可是。為表中的每個列都添加索引,是很不明智的,這是由於,添加索引也有很多不利的一個方面。
  • 創建索引和維護索引要耗費時間。這樣的時間隨著數據量的添加而添加。
  • 索引須要占物理空間,除了數據表占數據空間之外。每個索引還要占一定的物理空間。假設要建立舉聚簇索引,那麽須要的空間就會更大。

  • 當對表中的數據進行添加、刪除和改動的時候。索引也要動態的維護,這樣就減少了數據的維護速度。

  • 索引是建立在數據庫表中的某些列上。因此在創建索引的時候,應該細致考慮在哪些列上能夠創建索引,在哪些列上不能創建索引,一般來說,應該在這些列上創建索引:
1、在常常須要搜索的列上,能夠加快搜索速度 2、在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構。 3、在經經常使用在連接的列上。這些列主要是一些外鍵,能夠加快連接的速度。 4、在常常須要依據範圍進行搜索的列上創建索引,由於索引已經排序,其指定的範圍是連續的。

5、在常常須要排序的列上創建索引,由於索引已經排序。這樣查詢能夠利用索引的排序,加快排序查詢時間。

6、在常常使用where子句中的列上面創建索引,加快條件的推斷速度。 相同對於有些列是不應該創建索引的。一般來說。不應該創建索引的這些列具有下列特點:
1、對於那些在查詢中非常少使用或者參考的列不應該創建索引,這是由於。既然這些列非常少使用到,因此有索引或者無索引,並不能提高查詢速度,相反,由於添加了索引,反而減少了系統的維護速度和添加了空間需求。 2、對於那些僅僅有非常少數據值的列也不應該添加索引。這是由於。由於這些列的取值非常少,比方人事表的性別列,在查詢的結果中。結果集的數據行占了表中數據行的非常大比例,即須要在表中搜索的數據行的比例非常大。著呢國家索引,並不能明顯加快檢索速度。

3、對於那些定義為text、Image和bit數據類型的列不應該添加索引。這是由於,這些列的數據量要麽相當大,要麽取值非常少。 4、當改動性能遠遠大於檢索性能時,不應該創建索引。這是由於。改動性能和檢索性能是互相矛盾的。當添加索引時。會提高檢索性能,可是會減少改動性能。當減少索引時。會提高改動性能,減少檢索性能,因此,當改動性能遠遠大於檢索性能時,不應該創建索引。 3、創建索引 創建索引有多種方法。這些方法包含直接創建索引方法和間接創建索引的方法,直接創建索引,使用例如以下語句: CREATE [UNIQUE][CLUSTER][INDEX <索引名> ON <表名> (<列名>[<次序>][,<列名>[<次序>]]......)。 說明: 當中<表名>是要創建索引的基本表的名字,索引還能夠建立在該表的一列或者多列上,各列之間用逗號分隔,每一個<列名>後面還能夠用<次序>指定索引值的排序次序,可選ASC(升序)或者DESC(降序),缺省值為ASC。

UNIQUE表明此索引的每個索引值值相應唯一的數據記錄。

CLUSTER表示要建立的索引是聚簇索引,所謂聚簇索引是指索引項的順序與表中記錄的物理順序一致的索引組織。 另一種方法創建索引,在表中定義主鍵約束或者唯一約束時。同一時候也創建了索引,盡管,這兩種方法都能夠創建索引。可是它們創建索引的詳細內容是有差別的:當在表上定義主鍵或者唯一約束時,假設表中已經有了使用CREATE INDEX語句創建的標準索引的,那麽主鍵約束或者唯一性約束創建的索引覆蓋曾經創建的標準索引。也就是說主鍵約束或者唯一約束創建的索引的優先級高於使用CREATE INDEX語句創建的索引。 eg:為學生-課程數據庫中的Student,Course。SC 3個表建立索引,當中Student表按學號升序建唯一索引,Course表按課程號升序建唯一索引,SC表按學號升序和課程號降序建唯一索引。

CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Coucno ON Course(Cno); CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
4、刪除索引 索引一經建立,就有系統使用和維護它,不須要用戶的幹預,建立索引是為了降低查詢操作的時間,但假設數據增刪改頻繁,系統會花費很多時間來維護索引,從而降低了查詢效率。這時能夠刪除一些不必要的索引。 在SQL中。刪除索引使用DROP INDEX 語句,其一般格式為: DROP INDEX <索引名>; eg:刪除Student表的Stusname索引 DROP INDEX Stusname; 刪除索引時,系統會同一時候刪除數據字典中刪除有該索引的描寫敘述。
5、總結 在RDBMS中索引一般採用B+樹、HASH索引來實現。B+樹索引具有動態平衡的長處,HASH索引具有查找速度快的特點,索引是關系數據庫的內部實現技術。屬於內模式的範疇。 用戶使用CREATE INDEX語句定義索引時。能夠定義索引是唯一索引、非唯一索引或者聚餐索引。至於某一個索引是採用B+樹,還是HASH索引則由詳細的RDBMS來決定。

數據庫系統概論-[04]索引