發展歷史
舊稱通檢、備檢或引得。組成的基本單位是索引款目。款目一般包括索引詞、說明或注釋語 、出處3項內容。所有索引款目實現有序化編排。其本質特徵是只揭示內容出處或文獻線索 ,並不直接提供事實、資料本身。主要功能是為人們準確、迅速地獲得文獻資料提供線索性指引。常見的索引主要有報刊論文資料索引、文集篇目索引、語詞索引、文句索引、關鍵字索引、專名索引、主題索引等。
索引最早出現於西方,主要是中世紀歐洲宗教著作的索引。18世紀以後西方開始有主題索引,至19世紀末,內容分析索引被廣泛使用。中國的索引出現較晚。一般認為,明末傅山所編的《兩漢書姓名韻》是現存最早的人名索引。清代乾嘉時期,章學誠曾力倡編纂群書綜合索引。20世紀20年代,隨著西方索引理論與編制技術的傳入,中國現代意義上的索引編制與研究才蓬勃展開。1930年錢亞新發表《索引和索引法》,1932年洪業發表《引得說》,標誌著具有中國特色的現代索引理論、技術已迅速發展起來。20世紀50年代,計算機技術被運用於索引編制。此後,機編索引的大量出現,使索引編制理論、技術、索引載體形式發生了深刻變革。
目前SQL標準中沒有涉及索引,但商用關係資料庫管理系統一般都支持索引機制,只是不同的關係資料庫管理系統支持的索引類型不盡相同。
索引已經成為關係資料庫非常重要的部分。它們被用作包含所關心數據的表指針。通過一個索引,能從表中直接找到一個特定的記錄,而不必連續順序掃描這個表,一次一個地去查找。對於大的表,索引是必要的。沒有索引,要想得到一個結果要等好幾個小時、好幾天,而不是幾秒鐘。
定義概念
索引是為了加速對表中數據行的檢索而創建的一種分散的存儲結構。索引是針對表而建立的,它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。
在資料庫關係圖中,可以在選定表的“索引/鍵”屬性頁中創建、編輯或刪除每個索引類型。當保存索引所附加到的表,或保存該表所在的關係圖時,索引將保存在資料庫中。
作用
在資料庫系統中建立索引主要有以下作用:
(1)快速取數據;
(2)保證數據記錄的唯一性;
(3)實現表與表之間的參照完整性;
(4)在使用ORDER by、group by子句進行數據檢索時,利用索引可以減少排序和分組的時間。
優缺點
優點
1.大大加快數據的檢索速度;
2.創建唯一性索引,保證資料庫表中每一行數據的唯一性;
3.加速表和表之間的連線;
4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。
缺點
1.索引需要占物理空間。
2.當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度。
索引類型
根據資料庫的功能,可以在資料庫設計器中創建四種索引:普通索引、唯一索引、主鍵索引和聚集索引。
普通索引
最基本的索引類型,沒有唯一性之類的限制。普通索引可以通過以下幾種方式創建:
創建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
創建表的時候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
唯一索引
唯一索引是不允許其中任何兩行具有相同索引值的索引。
當現有數據中存在重複的鍵值時,大多數資料庫不允許將新創建的唯一索引與表一起保存。資料庫還可能防止添加將在表中創建重複鍵值的新數據。例如,如果在 employee 表中職員的姓 (lname) 上創建了唯一索引,則任何兩個員工都不能同姓。
對某個列建立UNIQUE索引後,插入新記錄時,資料庫管理系統會自動檢查新紀錄在該列上是否取了重複值,在CREATE TABLE 命令中的UNIQE約束將隱式創建UNIQUE索引。
創建唯一索引的幾種方式:
創建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表); ;
創建表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );
主鍵索引
簡稱為主索引,資料庫表中一列或列組合(欄位)的值唯一標識表中的每一行。該列稱為表的主鍵。
在資料庫關係圖中為表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問。
提示儘管唯一索引有助於定位信息,但為獲得最佳性能結果,建議改用主鍵索引。
候選索引
與主索引一樣要求欄位值的唯一性,並決定了處理記錄的順序。在資料庫和自由表中,可以為每個表建立多個候選索引。
聚集索引
也稱為聚簇索引,在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引, 即如果存在聚集索引,就不能再指定CLUSTERED 關鍵字。
索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數據訪問速度。聚集索引更適用於對很少對基表進行增刪改操作的情況。
如果在表中創建了主鍵約束,SQL Server將自動為其產生唯一性約束。在創建主鍵約束時,指定了CLUSTERED關鍵字或乾脆沒有制定該關鍵字,SQL Sever將會自動為表生成唯一聚集索引。
非聚集索引
也叫非簇索引,在非聚集索引中,資料庫表中記錄的物理順序與索引順序可以不相同。一個表中只能有一個聚集索引,但表中的每一列都可以有自己的非聚集索引。如果在表中創建了主鍵約束,SQL Server將自動為其產生唯一性約束。在創建主鍵約束時,如果制定CLUSTERED關鍵字,則將為表產生唯一聚集索引。
操縱索引
維護和使用
DBMS自動完成維護和自動選擇是否使用索引以及使用哪些索引。
創建索引
SQL3沒有提供建立索引的方法。但是,從事DBMS開發、銷售的公司都提供他們具有這種功能的SQL工具。因為這些工具不是標準化的,它們相互不同。SQL語言使用CREATE INDEX 語句建立索引,其一般格式是:
CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED] INDEX <索引名>
ON <表名>(<列名>[ASC|DESC] [, <列名>[ASC|DESC]...])
說明:與表一樣,索引也需要有唯一的名字,且基於一個表來建立,可以根據表中的一列或者多列,當列的順序都是升序默認可不必標出,當屬性列有按照降序排列的,所有屬性的升序降序都不要標明。
UNIQUE——建立唯一索引。
CLUSTERED——建立聚集索引。
NONCLUSTERED——建立非聚集索引。
ASC——索引升序排序。
DESC——索引降序排序。
修改索引
對於已經建立的索引,如果需要對其重新命名,可以使用ALTER INDEX 語句。其一般格式為
ALTER INDEX <舊引索名字> RENAME TO<新引索名>
刪除索引
當某個時期基本表中數據更新頻繁或者某個索引不再需要時,需要刪除部分索引。SQL語言使用DROP INDEX 語句刪除索引,其一般格式是:
DROP INDEX<索引名>
刪除索引時,DBMS不僅在物理刪除相關的索引數據,也會從數據字典刪除有關該索引的描述。
注意事項
並非所有的資料庫都以相同的方式使用索引。作為通用規則,只有當經常查詢索引列中的數據時,才需要在表上創建索引。索引占用磁碟空間,並且降低添加、刪除和更新行的速度。如果應用程式非常頻繁地更新數據或磁碟空間有限,則可能需要限制索引的數量。在表較大時再建立索引,表中的數據越多,索引的優越性越明顯。
可以基於資料庫表中的單列或多列創建索引。多列索引使您可以區分其中一列可能有相同值的行。
如果經常同時搜尋兩列或多列或按兩列或多列排序時,索引也很有幫助。例如,如果經常在同一查詢中為姓和名兩列設定判據,那么在這兩列上創建多列索引將很有意義。
確定索引的有效性:
檢查查詢的 WHERE 和 JOIN 子句。在任一子句中包括的每一列都是索引可以選擇的對象。
對新索引進行試驗以檢查它對運行查詢性能的影響。
考慮已在表上創建的索引數量。最好避免在單個表上有很多索引。
檢查已在表上創建的索引的定義。最好避免包含共享列的重疊索引。
檢查某列中唯一數據值的數量,並將該數量與表中的行數進行比較。比較的結果就是該列的可選擇性,這有助於確定該列是否適合建立索引,如果適合,確定索引的類型。