數據庫索引html
1.什麼是索引數據庫
在數據庫中,索引的含義與平常意義上的「索引」一詞並沒有多大區別(想一想小時候查字典),它是用於提升數據庫表數據訪問速度的數據庫對象。
A)索引能夠避免全表掃描。多數查詢能夠僅掃描少許索引頁及數據頁,而不是遍歷全部數據頁。
B)對於非彙集索引,有些查詢甚至能夠不訪問數據頁。
C)彙集索引能夠避免數據插入操做集中於表的最後一個數據頁。
D)一些狀況下,索引還可用於避免排序操做。性能
固然,衆所周知,雖然索引能夠提升查詢速度,可是它們也會致使數據庫系統更新數據的性能降低,由於大部分數據更新須要同時更新索引。優化
例如這樣一個查詢:select * from table1 where id=44。若是沒有索引,必須遍歷整個表,直到ID等於44的這一行被找到爲止;有了索引以後(必須是在ID這一列上創建的索引),直接在索引裏面找44(也就是在ID這一列找),就能夠得知這一行的位置,也就是找到了這一行。可見,索引是用來定位的。指針
2.索引的存儲code
一條索引記錄中包含的基本信息包括:鍵值(即你定義索引時指定的全部字段的值)+邏輯指針(指向數據頁或者另外一索引頁)。htm
當你爲一張空表建立索引時,數據庫系統將爲你分配一個索引頁,該索引頁在你插入數據前一直是空的。此頁此時既是根結點,也是葉結點。每當你往表中插入一行數據,數據庫系統即向此根結點中插入一行索引記錄。當根結點滿時,數據庫系統大抵按如下步驟進行分裂:
A)建立兩個兒子結點
B)將原根結點中的數據近似地拆成兩半,分別寫入新的兩個兒子結點
C)根結點中加上指向兩個兒子結點的指針對象
一般情況下,因爲索引記錄僅包含索引字段值(以及4-9字節的指針),索引實體比真實的數據行要小許多,索引頁相較數據頁來講要密集許多。一個索引頁能夠存儲數量更多的索引記錄,這意味着在索引中查找時在I/O上佔很大的優點,理解這一點有助於從本質上了解使用索引的優點。blog
3.索引的類型排序
A) 惟一索引:惟一索引不容許兩行具備相同索引值
B) 主鍵索引:定義一個主鍵將自動建立主鍵索引,主鍵索引是惟一索引的特殊類型.要求每一個值惟一的,而且不能爲空。
C)彙集索引,表數據按照索引的順序來存儲的。對於彙集索引,葉子結點即存儲了真實的數據行,再也不有另外單獨的數據頁,每一個表只能一個
D)非彙集索引,表數據存儲順序與索引順序無關。對於非彙集索引,數據存儲在一個位置,索引存儲在另外一個位置,索引中包含指向數據存儲位置的指針。
4. 索引建立語法
crate [unique](惟一) [clustered](彙集) [nonclustered] index 索引名稱 on 表名(列名)
注:以上[]中的值根據須要選擇一個
5.索引刪除語法
drop index 表名.索引名
sysindexes:系統索引表
6.索引優缺點
優勢: 建立索引能夠大大提升系統的性能。
1):經過建立惟一性索引,能夠保證數據庫表中每一行數據的惟一性。
2):能夠大大加快數據的檢索速度,這也是建立索引的最主要的緣由。
3):能夠加速表和表之間的鏈接,特別是在實現數據的參考完整性方面特別有意義。
4):在使用分組和排序子句進行數據檢索時,一樣能夠顯著減小查詢中分組和排序的時間。
5):經過使用索引,能夠在查詢的過程當中,使用優化隱藏器,提升系統的性能。
缺點: 1):建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長。
2):索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是要創建聚簇索引,那麼須要的空間就會更大。
3):當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,這樣就下降了數據的維護速度。
索引是創建在數據庫表中的某些列的上面。在建立索引的時候,應該考慮在哪些列上能夠建立索引,在哪些列上不能建立索引。
通常來講,應該在這些列上建立索引:
1):在常常須要搜索的列上,能夠加快搜索的速度;
2):在做爲主鍵的列上,強制該列的惟一性和組織表中數據的排列結構;
3):在常常用在鏈接的列上,這些列主要是一些外鍵,能夠加快鏈接的速度;在常常須要根據範圍進行搜索的列上建立索引,由於索引已經排序,其指定的範圍是連續的;
4):在常常須要排序的列上建立索引,由於索引已經排序,這樣查詢能夠利用索引的排序,加快排序查詢時間;
5):在常用在WHERE子句中的列上面建立索引,加快條件的判斷速度。
一樣,對於有些列不該該建立索引。通常來講,不該該建立索引的的這些列具備下列特色:
1):對於那些在查詢中不多使用或者參考的列不該該建立索引。這是由於,既然這些列不多使用到,所以有索引或者無索引,並不能提升查詢速度。
相反,因爲增長了索引,反而下降了系統的維護速度和增大了空間需求。
2):對於那些只有不多數據值的列也不該該增長索引。這是由於,因爲這些列的取值不多,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,
即須要在表中搜索的數據行的比例很大。增長索引,並不能明顯加快檢索速度。
3):對於那些定義爲text, image和bit數據類型的列不該該增長索引。這是由於,這些列的數據量要麼至關大,要麼取值不多,不利於使用索引。
4):當修改性能遠遠大於檢索性能時,不該該建立索引。這是由於,修改性能和檢索性能是互相矛盾的。當增長索引時,會提升檢索性能,可是會下降修改性能。
當減小索引時,會提升修改性能,下降檢索性能。所以,當修改操做遠遠多於檢索操做時,不該該建立索引。
原:https://www.cnblogs.com/ToNi/p/4233116.html