索引基礎知識

2021-07-04 12:19:20 字數 2826 閱讀 2024

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儲存引擎支援雜湊索引。優點 提高檢索資料的速度。對於有依賴關係的子表和父表之間的聯合,可提...