參考文章:
一、索引定義和分類
索引是對
資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。比如說課本的目錄就是乙個索引,我們要找某個知識點時,不必從頭到尾每頁都翻,只需要在目錄中查詢到該知識點的所在頁數,直接翻到即可,這就加快了查詢的效率。
索引的實現通常是採用b樹或者b+樹。
索引分類:唯一索引、主鍵索引、聚集索引。
1、唯一索引:
唯一索引是不允許其中任何兩行具有相同索引值的索引。
當現有資料中存在重複的鍵值時,大多數資料庫不允許將新建立的唯一索引與表一起儲存。資料庫還可能防止新增將在表中建立重複鍵值的新資料。例如,如果在employee表中職員的姓(lname)上建立了唯一索引,則任何兩個員工都不能同姓。
2、主鍵索引:
資料庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。
在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。
3、聚集索引:
聚集索引儲存記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理儲存並不連續。在資料庫的乙個表中只能有乙個聚集索引,但是可以有多個非聚集索引。
舉例:在查字典時,我們可以根據拼音來查,也可以根據偏旁來查。因為正文中的字的順序和拼音的順序是一樣的,因此拼音查詢就是聚集索引;但偏旁查詢使,有同乙個偏旁的字,一般會分散在正文中的不同位置,並不是同乙個偏旁的按順序在一起,所以偏旁查詢就是非聚集索引。
二、索引的儲存
聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,其實理解起來非常簡單,還是舉字典的例子:如果按照拼音查詢,那麼都是從a-z的,是具有連續性的,a後面就是b,b後面就是c, 聚集索引就是這樣的,他是和表的物理排列順序是一樣的,例如有id為聚集索引,那麼1後面肯定是2,2後面肯定是3,所以說這樣的搜尋順序的就是聚集索引。非聚集索引就和按照部首查詢是一樣是,可能按照偏房查詢的時候,根據偏旁『弓』字旁,索引出兩個漢字,張和弘,但是這兩個其實乙個在100頁,乙個在1000頁,(這裡只是舉個例子),他們的索引順序和資料庫表的排列順序是不一樣的,這個樣的就是非聚集索引。
原理明白了,那他們是怎麼儲存的呢?在這裡簡單的說一下,聚集索引就是在資料庫被開闢乙個物理空間存放他的排列的值,例如1-100,所以當插入資料時,他會重新排列整個整個物理空間,而非聚集索引其實可以看作是乙個含有聚集索引的表,他只僅包含原表中非聚集索引的列和指向實際物理表的指標。他只記錄乙個指標,其實就有點和堆疊差不多的感覺了
索引的儲存結構一般是b樹或者b+樹。這樣儲存是為了加快查詢某個索引的位置,有點類似在乙個陣列中用二分查詢來確定某個數字的位置。用這種方式可以使查詢索引的時間複雜度為logn(n為索引項的個數)。查詢到索引後,就可以確定所需資料的位置,直接定位即可。
三、索引的優缺點
建立索引可以大大提高系統的效能。(優點)
第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。
第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。
第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。
第四,在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。
也許會有人要問:增加索引有如此多的優點,為什麼不對錶中的每乙個列建立乙個索引呢?因為,增加索引也有許多不利的方面。(缺點)
第一,建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
第二,索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
第三,當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。
四、索引的適用條件
一般來說,應該在這些列上建立索引:
1、在經常需要搜尋的列上,可以加快搜尋的速度;
2、在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;
3、在經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度;
4、在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;
5、在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
6、在經常使用在where子句中的列上面建立索引,加快條件的判斷速度。
一般來說,不應該建立索引的的這些列具有下列特點:
1、對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
2、對於那些只有很少資料值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比例,即需要在表中搜尋的資料行的比例很大。增加索引,並不能明顯加快檢索速度。
3、對於那些定義為text, image和bit資料型別的列不應該增加索引。這是因為,這些列的資料量要麼相當大,要麼取值很少。
4、當修改效能遠遠大於檢索效能時,不應該建立索引。這是因為,
修改效能和檢索效能是互相矛盾的
。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠遠大於檢索效能時,不應該建立索引。
五、索引的應用
在資料庫中建立索引:
1、建立索引的語法:
create [unique][clustered | nonclustered] index index_name
on [with [index_property [,....n]]
說明:unique: 建立唯一索引。
clustered: 建立聚集索引。
nonclustered: 建立非聚集索引。
index_property: 索引屬性。
unique索引既可以採用聚集索引結構,也可以採用非聚集索引的結構,如果不指明採用的索引結構,則
sql server
系統預設為採用非聚集索引結構。
2、刪除索引語法:
drop index table_name.index_name[,table_name.index_name]
說明:table_name:
索引所在的表名稱。
index_name : 要刪除的索引名稱。
作業系統中磁碟分頁的索引:
在分頁系統中,允許將程序的各個頁離散地儲存在記憶體不同的物理塊中,但系統應該保證程序的正確執行,即能在記憶體中找到每個頁面所對應的物理塊。系統又為每個程序建立了一張頁表,其記錄著相應頁在記憶體中對應的物理塊號。程序在執行時,通過查詢頁表找到記憶體中對應的物理塊號。這個頁表就是乙個索引,通過查詢頁表,能夠找到所需頁在記憶體中的位址,進而訪問資料。分頁如下圖所示:
(目前學到這裡,以後再補充)
資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
資料庫索引
索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...