一,什麼是索引
資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。
例如這樣乙個查詢:select * from table1 where id=44。如果沒有索引,必須遍歷整個表,直到id等於44的這一行被找到為止;有了索引之後(必須是在id這一列上建立的索引),直接在索引裡面找44(也就是在id這一列找),就可以得知這一行的位置,也就是找到了這一行。可見,索引是用來定位的。
索引分為聚簇索引和非聚簇索引兩種,聚簇索引 是按照資料存放的物理位置為順序的,而非聚簇索引就不一樣了;顯然在乙個基本表上最多只能建立乙個聚簇索引。建立聚簇索引後,更新該索引列上的資料時,往往導致表中記錄的物理順序的變更,代價較大,因此對於經常更新得列不宜建立聚簇索引,聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快。建立乙個聚簇索引如:
create cluster index id on student(id);
二,概述
建立索引的目的是加快對錶中記錄的查詢或排序。
為表設定索引要付出代價的:一是增加了資料庫的儲存空間,二是在插入和修改資料時要花費較多的時間(因為索引也要隨之變動)。
精簡來說,索引是一種結構.在sql server中,索引和表(這裡指的是加了聚集索引的表)的儲存結構是一樣的,都是b樹,b樹是一種用於查詢的平衡多叉樹.理解b樹的概念如下圖:
理解為什麼使用b樹作為索引和表(有聚集索引)的結構,首先需要理解sql server儲存資料的原理.
在sql server中,儲存的單位最小是頁(page),頁是不可再分的。就像細胞是生物學中不可再分的,或是原子是化學中不可再分的最小單位一樣.這意味著,sql server對於頁的讀取,要麼整個讀取,要麼完全不讀取,沒有折中.
在資料庫檢索來說,對於磁碟io掃瞄是最消耗時間的.因為磁碟掃瞄涉及很多物理特性,這些是相當消耗時間的。所以b樹設計的初衷是為了減少對於磁碟的掃瞄次數。如果乙個表或索引沒有使用b樹(對於沒有聚集索引的表是使用堆heap儲存),那麼查詢乙個資料,需要在整個表包含的資料庫頁中全盤掃瞄。這無疑會大大加重io負擔.而在sql server中使用b樹進行儲存,則僅僅需要將b樹的根節點存入記憶體,經過幾次查詢後就可以找到存放所需資料的被葉子節點包含的頁!進而避免的全盤掃瞄從而提高了效能.
下面,通過乙個例子來證明:
在sql server中,表上如果沒有建立聚集索引,則是按照堆(heap)存放的,假設我有這樣一張表:
現在這張表上沒有任何索引,也就是以堆存放,我通過在其上加上聚集索引(以b樹存放)來展現對io的減少:
在sql server中,最主要的兩類索引是聚集索引和非聚集索引。可以看到,這兩個分類是圍繞聚集這個關鍵字進行的.那麼首先要理解什麼是聚集.
聚集在索引中的定義:
為了提高某個屬性(或屬性組)的查詢速度,把這個或這些屬性(稱為聚集碼)上具有相同值的元組集中存放在連續的物理塊稱為聚集。
簡單來說,聚集索引就是:
在sql server中,聚集的作用就是將某一列(或是多列)的物理順序改變為和邏輯順序相一致,比如,我從adventureworks資料庫的employee中抽取5條資料:
當我在contactid上建立聚集索引時,再次查詢:
在sql server中,聚集索引的儲存是以b樹儲存,b樹的葉子直接儲存聚集索引的資料:
因為聚集索引改變的是其所在表的物理儲存順序,所以每個表只能有乙個聚集索引.
因為每個表只能有乙個聚集索引,如果我們對乙個表的查詢不僅僅限於在聚集索引上的字段。我們又對聚集索引列之外還有索引的要求,那麼就需要非聚集索引了.
非聚集索引,本質上來說也是聚集索引的一種.非聚集索引並不改變其所在表的物理結構,而是額外生成乙個聚集索引的b樹結構,但葉子節點是對於其所在表的引用,這個引用分為兩種,如果其所在表上沒有聚集索引,則引用行號。如果其所在表上已經有了聚集索引,則引用聚集索引的頁.
乙個簡單的非聚集索引概念如下:
可以看到,非聚集索引需要額外的空間進行儲存,按照被索引列進行聚集索引,並在b樹的葉子節點包含指向非聚集索引所在表的指標.
msdn中,對於非聚集索引描述圖是:
可以看到,非聚集索引也是乙個b樹結構,與聚集索引不同的是,b樹的葉子節點存的是指向堆或聚集索引的指標.
通過非聚集索引的原理可以看出,如果其所在表的物理結構改變後,比如加上或是刪除聚集索引,那麼所有非聚集索引都需要被重建,這個對於效能的損耗是相當大的。所以最好要先建立聚集索引,再建立對應的非聚集索引.
前面通過對於聚集索引和非聚集索引的原理解釋.我們不難發現,大多數情況下,聚集索引的速度比非聚集索引要略快一些.因為聚集索引的b樹葉子節點直接儲存資料,而聚集索引還需要額外通過葉子節點的指標找到資料.
還有,對於大量連續資料查詢,非聚集索引十分乏力,因為非聚集索引需要在非聚集索引的b樹中找到每一行的指標,再去其所在表上找資料,效能因此會大打折扣.有時甚至不如不加非聚集索引.
因此,大多數情況下聚集索引都要快於非聚集索引。但聚集索引只能有乙個,因此選對聚集索引所施加的列對於查詢效能提公升至關緊要.
海量資料處理 倒排索引
在資訊大 的今天,有了搜尋引擎的幫助,使得我們能夠快速,便捷的找到所求。提到搜尋引擎,就不得不說vsm模型,說到vsm,就不得不聊倒排索引。可以毫不誇張的講,倒排索引是搜尋引擎的基石。vsm全稱是vector space model 向量空間模型 是ir information retrieval資...
海量資料處理專題(七) 資料庫索引及優化
索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。什麼是索引 資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。例如這樣乙個查詢 select from table1 where id 44。如果沒有索引,必須遍歷整個表,直到id等於44的這一行被找...
海量資料處理專題(七) 資料庫索引及優化
索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。例如這樣乙個查詢 select from table1 where id 44。如果沒有索引,必須遍歷整個表,直到id等於44的這一行被找到為止 有了...