1、快速取資料
2、保證資料記錄的唯一性
3、加快表的連線速度
4、在使用order by、group by子句進行資料檢索時,利用索引可以減少排序和分組的時間。
1、索引需要佔物理空間。
2、當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度。
其實, 索引的本質是乙個查詢問題。索引一般都是用btree或者btree的變種(包括b+樹、b-樹、b*樹)
btree即二叉搜尋樹。如下圖所示。這個的查詢應該不用說大家都知道。
如果這個btree是平衡二叉樹,那麼他的查詢效能是逼近二分查詢的。但是如果是下圖所示,那麼查詢的效能會非常差。如何將一棵樹轉換為平衡二叉樹,這個留著以後寫。
是一種多路搜尋樹(並不是二叉的):
1、定義任意非葉子結點最多只有m個兒子;且m>2;
2、根結點的兒子數為[2, m];
3、除根結點以外的非葉子結點的兒子數為[m/2,m];
4、每個結點存放至少m/2-1(取上整)和至多m-1個關鍵字;(至少2個關鍵字)
5、非葉子結點的關鍵字個數=指向兒子的指標個數-1;
6、非葉子結點的關鍵字:k[1],k[2], …, k[m-1];且k[i] < k[i+1];
7、非葉子結點的指標:p[1], p[2],…, p[m];其中p[1]指向關鍵字小於k[1]的子樹,p[m]指向關鍵字大於k[m-1]的子樹,其它p[i]指向關鍵字屬於(k[i-1], k[i])的子樹;
8、所有葉子結點位於同一層;
如:(m=3)的乙個b-樹如下:
b-樹的搜尋,從根結點開始,對結點內的關鍵字(有序)序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指標為空,或已經是葉子結點;
b-樹有如下特性:
1、關鍵字集合分布在整顆樹中;
2、任何乙個關鍵字出現且只出現在乙個結點中;
3、搜尋有可能在非葉子結點結束;
b+樹是b-樹的變體,也是一種多路搜尋樹。其定義基本與b-樹同,除了以下幾點:
1、非葉子結點的子樹指標與關鍵字個數相同;
2、非葉子結點的子樹指標p[i],指向關鍵字值屬於[k[i],k[i+1])的子樹(b-樹是開區間);
3、為所有葉子結點增加乙個鏈指標;
4、所有關鍵字都在葉子結點出現;
b+樹有如下特性:
1.所有關鍵字都出現在葉子結點的鍊錶中(稠密索引),且鍊錶中的關鍵字恰好是有序的;
2.不可能在非葉子結點命中;
3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層;
4.更適合檔案索引系統;
總結如下:
b樹:二叉樹,每個結點只儲存乙個關鍵字,等於則命中,小於走左結點,大於走右結點;
b-樹:多路搜尋樹,每個結點儲存m/2到m個關鍵字,非葉子結點儲存指向關鍵字範圍的子結點;所有關鍵字在整顆樹中出現,且只出現一次,非葉子結點可以命中;
b+樹:在b-樹基礎上,為葉子結點增加鍊錶指標,所有關鍵字都在葉子結點中出現,非葉子結點作為葉子結點的索引;b+樹總是到葉子結點才命中;
該部分參考了
按照資料庫中可以建立的索引型別來分:
這是最基本的索引型別,而且它沒有唯一性之類的限制。
建立普通索引的方法如下:create
index
索引的名
on tablename(列的列表)
不允許其中任何兩行具有相同索引值的索引
建立唯一索引的方法如下:
create
unique
index
索引的名
on tablename(列的列表)
其實主鍵索引是唯一索引的一種特殊型別。主鍵索引支援,在建立表的主鍵時,主鍵索引會自動建立。
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。
聚集索引乙個表只能有乙個,而非聚集索引乙個表可以存在多個。
與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。
1、小的資料型別通常更好
越小的資料型別通常在磁碟、記憶體和cpu快取中都需要更少的空間,處理起來更快。
2、簡單的資料型別更好
整型資料比起字元,處理開銷更小,因為字串的比較更複雜。在mysql中,應該用內建的日期和時間資料型別,而不是用字串來儲存時間;以及用整型資料型別儲存ip位址。
3、盡量避免null
應該指定列為not null,除非你想儲存null。在mysql中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計資訊以及比較運算更加複雜。你應該用0、乙個特殊的值或者乙個空串代替空值。
4、如果對多列進行索引(組合索引),列的順序非常重要
mysql僅能對索引最左邊的字首進行有效的查詢。例如:假設存在組合索引it1c1c2(c1,c2),查詢語句select * from t1 where c1=1 and c2=2能夠使用該索引。查詢語句select *from t1 where c1=1也能夠使用該索引。但是,查詢語句select * from t1 where c2=2不能夠使用該索引,因為沒有組合索引的引導列,即,要想使用c2列進行查詢,必需出現c1等於某值。
索引基礎知識
sql server 2005 其他版本 0 共 1 對本文的評價是有幫助 評價此主題 索引是與表或檢視關聯的磁碟上結構,可以加快從表或檢視中檢索行的速度。索引包含由表或檢視中的一列或多列生成的鍵。這些鍵儲存在乙個結構 b 樹 中,使 sql server 可以快速有效地查詢與鍵值關聯的行。表或檢視...
索引基礎知識
間隙鎖實質上是對索引前後的間隙上鎖,不對索引本身上鎖。根據檢索條件向左尋找最靠近檢索條件的記錄值a,作為左區間,向右尋找最靠近檢索條件的記錄值b作為右區間,即鎖定的間隙為 a,b 間隙鎖的目的是為了防止幻讀,其主要通過兩個方面實現這個目的 1 防止間隙內有新資料被插入。2 防止已存在的資料,更新成間...
Mysql基礎知識 索引
mysql 索引 1.索引的概念 索引是建立在表上的,對資料庫表中的一列或多列的值進行排序的一種結構。索引有2種儲存型別 b型樹索引 和 雜湊索引。innodb和myisam儲存引擎支援b型樹索引,memory儲存引擎支援雜湊索引。優點 提高檢索資料的速度。對於有依賴關係的子表和父表之間的聯合,可提...