1. 程式人生 > >資料庫建立索引的注意事項

資料庫建立索引的注意事項

資料庫索引詳解

[By GavinHacker

轉載請標明出處:http://www.cnblogs.com/gavinsp/p/5513536.html

關於資料庫索引,相信大家用到最多的一定是資料庫設計和資料庫查詢,本篇深度解析一下資料庫索引的原理,涉及資料庫本身的設計原理,對設計應用的資料庫結構,和資料庫查詢也大有益處。

 

(一)在瞭解資料庫索引之前,首先了解一下資料庫索引的資料結構基礎,B+tree

B+tree 是一個n叉樹,每個節點有多個葉子節點,一顆B+樹包含根節點,內部節點,葉子節點。根節點可能是一個葉子節點,也可能是一個包含兩個或兩個以上葉子節點的節點。

B+tree的性質:

1.n棵子tree的節點包含n個關鍵字,不用來儲存資料而是儲存資料的索引。

2.所有的葉子結點中包含了全部關鍵字的資訊,及指向含這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序連結。

3.所有的非終端結點可以看成是索引部分,結點中僅含其子樹中的最大(或最小)關鍵字。

B+tree結構原型圖大概如下(引用):

這裡還有一篇百度文庫文章可以參考 http://wenku.baidu.com/link?url=qniQ1rpN8XOlbs4Vu6pjd_7YzVOGYxmBH0TeHLJTvwQ3Qs9Ig-FJyodXSaeBc3Ap7nC6Rm9qD6We5oJL-j7vnM4Ro5Y5J7yHwCk3asL_q5e

由於B+tree的性質, 它通常被用於資料庫和作業系統的檔案系統中。NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等檔案系統都在使用B+樹作為元資料索引,因為B+ 樹的特點是能夠保持資料穩定有序,其插入與修改擁有較穩定的對數時間複雜度(B+ 樹元素自底向上插入)。

(二)資料庫索引

資料庫索引是用於提高資料庫表的資料訪問速度的。

資料庫索引的特點:

a)避免進行資料庫全表的掃描,大多數情況,只需要掃描較少的索引頁和資料頁,而不是查詢所有資料頁。而且對於非聚集索引,有時不需要訪問資料頁即可得到資料。

b)聚集索引可以避免資料插入操作,集中於表的最後一個數據頁面。

c)在某些情況下,索引可以避免排序操作。

資料庫索引的儲存方式,型別,在執行時的操作原理,我製作成了下圖:

 

關於資料庫索引在資料庫表設計和應用查詢中所涉及的知識會在之後的文章中分享。

轉載請標明出處:http://www.cnblogs.com/gavinsp/p/5513536.html

 

資料庫建立索引的注意事項

出於對作者的尊重和感謝,原文地址為 http://www.studyofnet.com/news/449.html

索引可以提高資料的訪問速度,但同時也增加了插入、更新和刪除操作的處理時間。所以是否要為表增加索引、索引建立在那些欄位上,是建立索引前必須要考慮的問題。解決此問題就是分析應用程式的業務處理、資料使用,為經常被用作查詢條件、或者被要求排序的欄位建立索引。

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

 

一、資料庫索引建立規則

 

1、表的主鍵、外來鍵必須有索引;
2、資料量超過300的表應該有索引;
3、經常與其他表進行連線的表,在連線欄位上應該建立索引;


4、經常出現在Where子句中的欄位,特別是大表的欄位,應該建立索引;
5、索引應該建在選擇性高的欄位上;
6、索引應該建在小欄位上,對於大的文字欄位甚至超長欄位,不要建索引;


7、複合索引的建立需要進行仔細分析;儘量考慮用單欄位索引代替:


A、正確選擇複合索引中的主列欄位,一般是選擇性較好的欄位;
B、複合索引的幾個欄位是否經常同時以AND方式出現在Where子句中?單欄位查詢是否極少甚至沒有?如果是,則可以建立複合索引;否則考慮單欄位索引;
C、如果複合索引中包含的欄位經常單獨出現在Where子句中,則分解為多個單欄位索引;
D、如果複合索引所包含的欄位超過3個,那麼仔細考慮其必要性,考慮減少複合的欄位;
E、如果既有單欄位索引,又有這幾個欄位上的複合索引,一般可以刪除複合索引;搜尋


8、頻繁進行資料操作的表,不要建立太多的索引;
9、刪除無用的索引,避免對執行計劃造成負面影響;

 

二、一般選擇在這樣的列上建立索引     1. 在經常需要搜尋查詢的列上建立索引,可以加快搜索的速度;   2. 在作為主鍵的列上建立索引,強制該列的唯一性和組織表中資料的排列結構;   3. 在經常用在連線的列上建立索引,這些列主要是一些外來鍵,可以加快連線的速度;     4. 在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;   5. 在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢 時間;   6. 在經常使用在Where子句中的列上面建立索引,加快條件的判斷速度;   7. 為經常出現在關鍵字order by、group by、distinct後面的欄位,建立索引。       三、一般不選擇具有這些特點的列上建立索引     1. 對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查 詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求;   2. 不要在有大量相同取值的欄位上,建立索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比例,即需要在表中搜索的資料行的比例很大。增加索引,並不能明顯加 快檢索速度;   3. 對於那些定義為text, image和bit資料型別的列不應該增加索引。這是因為,這些列的資料量要麼相當大,要麼取值很少;   4. 當修改效能遠遠大於檢索效能時,不應該建立索引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠遠大於檢索效能時,不應該建立索引。

 

四、建立索引需要注意的地方

1. 限制表上的索引數目。對一個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響資料的更新操作。   2. 避免在取值朝一個方向增長的欄位(例如:日期型別的欄位)上,建立索引;對複合索引,避免將這種型別的欄位放置在最前面。由於欄位的取值總是朝一個方向增長,新記錄總是存放在索引的最後一個葉頁中,從而不斷地引起該葉頁的訪問競爭、新葉頁的分配、中間分支頁的拆分。此外,如果所建索引是聚集索引,表中資料按照索引的排列順序存放,所有的插入操作都集中在最後一個數據頁上進行,從而引起插入“熱點”。   3. 對複合索引,按照欄位在查詢條件中出現的頻度建立索引。在複合索引中,記錄首先按照第一個欄位排序。對於在第一個欄位上取值相同的記錄,系統再按照第二個欄位的取值排序,以此類推。因此只有複合索引的第一個欄位出現在查詢條件中,該索引才可能被使用。因此將應用頻度高的欄位,放置在複合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。   4. 刪除不再使用,或者很少被使用的索引。表中的資料被大量更新,或者資料的使用方式被改變後,原有的一些索引可能不再被需要。資料庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。