資料庫索引

2021-08-17 15:11:58 字數 4160 閱讀 5285

索引的作用是排好次序,使得查詢時可以快速查詢到。

第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。

第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。

第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。

第四,在使用分組和排序語句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。

第一, 

索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間

第二,當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。

盡量選擇區分度高的字段作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃瞄的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大資料面前區分度是0。在性別字段上面加索引,並不能明顯加快檢索速度。

索引是建立在資料庫表中的某些列的上面。因此,在建立索引的時候,應該仔細考慮在哪些列上可以建立索引,在哪些列上不能建立索引。一般來說,應該在這些列上建立索引,例如:

· 在經常需要搜尋的列上,可以加快搜尋的速度;

· 在作為主鍵的列上強制該列的唯一性組織表中資料的排列結構

· 在經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度;

· 在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;

· 在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;

· 在經常使用在where

子句中的列上面建立索引,加快條件的判斷速度。

自動當表上定義foreign key,unique, primary key.時,系統會自動為其建立索引(當資料表被刪除時,索引自動被刪除)

手動:使用者通過createindex….語句建立索引,(drop index….)

建立、刪除索引語句

drop index tml_tml_id_idx2

ontml; //mysql

只要求本表內索引不重名,所以建立索引時必須指定表。

create [

索引型別

] index

索引名稱

on 表名(列名

)#建立表tml

基於字段

tml_id

的查詢速度

create

index tml_tml_id_idx   

//注意命名規範

ontml(tml_id);

#同時對多列建立索引

create

index tml_tml_id_idx2

ontml(tml_id,tml_name);#刪除

tml表上

tml_tml_id_idx2

索引(1)聚集索引和非聚集索引的根本區別是表中記錄的物理順序和索引的排列順序是否一致。聚集索引的表中記錄的物理順序與索引的排列順序一致。

優點是查詢速度快。因為一旦具有第乙個索引值的記錄被找到,具有連續索引值的記錄也一定物理的緊隨其後。

缺點是對錶進行修改速度比較慢。這是為了保持表中的記錄的物理順序與索引的順序相一致,而把記錄插入到資料頁的相應位置,必須在資料頁中進行資料重排,降低了執行速度。在插入新紀錄時資料檔案為了維持b+tree的特性而頻繁的**調整,十分低效。

(2)聚集索引和非聚集索引都採用b+數結構,但非聚集索引的葉子層並不與實際的資料頁相重疊,而採用葉子層包含乙個指向表中的記錄在資料頁中的指標方式。聚集索引的葉節點就是資料結點,而非聚集索引的葉節點任然是所以結點。

(3)非聚集索引在新增記錄時,不會引起資料順序的重組。

聚集索引使用場合:

(1)某列包含了小數目的不同值。

(2)排序和範圍查詢。

非聚集索引的使用場合:

(1)此列包含了大數目的不同值。

(2)頻繁更新的列。

基於多個欄位而建立的索引成為組合索引。

當b+樹的資料項是復合的資料結構,比如(name,age,***)的時候,b+數是按照從左到右的順序來建立搜尋樹的,比如當(張三,20,f)這樣的資料來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和***,最後得到檢索的資料;但當(20,f)這樣的沒有name的資料來的時候,b+樹就不知道下一步該查哪個節點,因為建立搜尋樹的時候name就是第乙個比較因子,必須要先根據name來搜尋才能知道下一步去**查詢。比如當(張三,f)這樣的資料來檢索時,b+樹可以用name來指定搜尋方向,但下乙個欄位age的缺失,所以只能把名字等於張三的資料都找到,然後再匹配性別是f的資料了,這個是非常重要的性質,即索引的最左匹配特性

在mysql中,索引屬於儲存引擎級別的概念。不同儲存引擎對索引的實現方式是不同的,討論myisam和innodb兩個儲存引擎的索引實現方式。

myisam:

(1)原理圖

由圖可以看出,myisam的索引檔案僅僅儲存資料記錄的位址。在myisam中,主索引和輔助索引在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重複。

innodb:

原理圖:

10.為什麼mysql選用b-/b+數作為儲存索引的資料結構?

1.檔案很大,不可能全部儲存在記憶體中,故要儲存到磁碟上

2.索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數(為什麼使用b-/+tree,還跟磁碟訪問原理有關。)

3.區域性性原理與磁碟預讀,預讀的長度一般為頁(page)的整倍數,(在許多作業系統中,頁得大小通常為4k)

4.資料庫系統巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次

i/o就可以完全載入,(由於節點中有兩個陣列,所以位址連續)。而紅黑樹這種結構,h明顯要深的多。由於邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性。

一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟i/o消耗,相對於記憶體訪問,i/o訪問的消耗要高幾個數量級,換句話說,索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數。為了儘量減少

i/o操作,磁碟讀取每次都會預讀,大小通常為頁的整數倍。即使只需要讀取乙個位元組,磁碟也會讀取一頁的資料

(通常為

4k)放入記憶體,記憶體與磁碟以頁為單位交換資料。因為區域性性原理認為,通常乙個資料被用到,其附近的資料也會立馬被用到。

b-tree

:如果一次檢索需要訪問

4個節點,

資料庫

系統設計者利用磁碟預讀原理,把節點的大小設計為乙個頁,那讀取乙個節點只需要一次

i/o操作,完成這次檢索操作,最多需要3次

i/o(

根節點常駐記憶體

)。資料記錄越小,每個節點存放的資料就越多,樹的高度也就越小,

i/o操作就少了,檢索效率也就上去了。

b+tree

:非葉子節點只存

key,大大滴減少了非葉子節點的大小,那麼每個節點就可以存放更多的記錄,樹更矮了,

i/o操作更少了。所以

b+tree

擁有更好的效能

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

資料庫索引

索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...