複製鏈接
請複製以下鏈接發送給好友

索引

(數據庫術語)

鎖定
關係數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
索引提供指向存儲在表的指定列中的數據值的指針,然後根據您指定的排序順序對這些指針排序。數據庫使用索引以找到特定值,然後順指針找到包含該值的行。這樣可以使對應於表的SQL語句執行得更快,可快速訪問數據庫表中的特定信息。
當表中有大量記錄時,若要對錶進行查詢,第一種搜索信息方式是全表搜索,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量數據庫系統時間,並造成大量磁盤I/O操作;第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。
中文名
索引
外文名
index
分    類
數據庫概念
作    用
應於表的SQL語句執行得更快

索引發展歷史

舊稱通檢、備檢或引得。組成的基本單位索引款目。款目一般包括索引詞、説明或註釋語 、出處3項內容 。所有索引款目實現有序化編排。其本質特徵是隻揭示內容出處或文獻線索 ,並不直接提供事實、資料本身。主要功能是為人們準確、迅速地獲得文獻資料提供線索性指引。常見的索引主要有報刊論文資料索引、文集篇目索引語詞索引文句索引關鍵詞索引專名索引主題索引等。
索引最早出現於西方,主要是中世紀歐洲宗教著作的索引。18世紀以後西方開始有主題索引,至19世紀末,內容分析索引被廣泛使用。中國的索引出現較晚。一般認為,明末傅山所編的《兩漢書姓名韻》是現存最早的人名索引。清代乾嘉時期,章學誠曾力倡編纂羣書綜合索引。20世紀20年代,隨着西方索引理論與編制技術的傳入,中國現代意義上的索引編制與研究才蓬勃展開 。1930年錢亞新發表《索引和索引法》,1932年洪業發表《引得説》,標誌着具有中國特色的現代索引理論、技術已迅速發展起來。20世紀50年代,計算機技術被運用於索引編制 。此後,機編索引的大量出現,使索引編制理論、技術、索引載體形式發生了深刻變革。
SQL標準中沒有涉及索引,但商用關係數據庫管理系統一般都支持索引機制,只是不同的關係數據庫管理系統支持的索引類型不盡相同。
索引已經成為關係數據庫非常重要的部分。它們被用作包含所關心數據的表指針。通過一個索引,能從表中直接找到一個特定的記錄,而不必連續順序掃描這個表,一次一個地去查找。對於大的表,索引是必要的。沒有索引,要想得到一個結果要等好幾個小時、好幾天,而不是幾秒鐘。 [1] 

索引定義概念

索引是為了加速對錶中數據行的檢索而創建的一種分散的存儲結構。索引是針對表而建立的,它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。 [2] 
在數據庫關係圖中,可以在選定表的“索引/鍵”屬性頁中創建、編輯或刪除每個索引類型。當保存索引所附加到的表,或保存該表所在的關係圖時,索引將保存在數據庫中。

索引作用

數據庫系統中建立索引主要有以下作用:
(1)快速取數據;
(2)保證數據記錄的唯一性;
(3)實現表與表之間的參照完整性
(4)在使用ORDER by、group by子句進行數據檢索時,利用索引可以減少排序和分組的時間。

索引優缺點

索引優點

1.大大加快數據的檢索速度;
2.創建唯一性索引,保證數據庫表中每一行數據的唯一性;
3.加速表和表之間的連接;
4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。

索引缺點

1.索引需要佔物理空間。
2.當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度。

索引索引類型

根據數據庫的功能,可以在數據庫設計器中創建四種索引:單列索引、唯一索引、主鍵索引和聚集索引

索引普通索引

最基本的索引類型,沒有唯一性之類的限制。普通索引可以通過以下幾種方式創建:
創建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表); [3] 
創建表的時候指定索引,例如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 [索引的名字] (列的列表) );

索引主鍵索引

簡稱為主索引,數據庫表中一列或列組合(字段)的值唯一標識表中的每一行。該列稱為表的主鍵。
在數據庫關係圖中為表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問。
提示儘管唯一索引有助於定位信息,但為獲得最佳性能結果,建議改用主鍵索引。

索引候選索引

主索引一樣要求字段值的唯一性,並決定了處理記錄的順序。在數據庫和自由表中,可以為每個表建立多個候選索引。 [4] 

索引聚集索引

也稱為聚簇索引,在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引, 即如果存在聚集索引,就不能再指定CLUSTERED 關鍵字。
索引 索引
索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數據訪問速度。聚集索引更適用於對很少對基表進行增刪改操作的情況。
如果在表中創建了主鍵約束,SQL Server將自動為其產生唯一性約束。在創建主鍵約束時,指定了CLUSTERED關鍵字或乾脆沒有制定該關鍵字,SQL Sever將會自動為表生成唯一聚集索引。

索引非聚集索引

也叫非簇索引,在非聚集索引中,數據庫表中記錄的物理順序與索引順序可以不相同。一個表中只能有一個聚集索引,但表中的每一列都可以有自己的非聚集索引。如果在表中創建了主鍵約束,SQL Server將自動為其產生唯一性約束。在創建主鍵約束時,如果制定CLUSTERED關鍵字,則將為表產生唯一聚集索引。 [5] 

索引操縱索引

索引維護和使用

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 子句。在任一子句中包括的每一列都是索引可以選擇的對象。
對新索引進行試驗以檢查它對運行查詢性能的影響。
考慮已在表上創建的索引數量。最好避免在單個表上有很多索引。
檢查已在表上創建的索引的定義。最好避免包含共享列的重疊索引。
檢查某列中唯一數據值的數量,並將該數量與表中的行數進行比較。比較的結果就是該列的可選擇性,這有助於確定該列是否適合建立索引,如果適合,確定索引的類型。
參考資料
  • 1.    陸慧娟.數據庫原理與應用:科學出版社,2006
  • 2.    周屹 李豔娟.數據庫原理及開發應用(第二版):清華大學出版社,2013:90
  • 3.    王珊 薩師煊.數據庫系統概率(第5版):高等教育出版社,2014:88-89
  • 4.    佟勇臣.數據庫原理與應用:中國水利水電出版社,2012:160-162
  • 5.    陶程仁.數據庫原理及應用:西南交通大學出版社,2011:62-64