欧美三区四区_av先锋影音资源站_亚洲第一论坛sis_影音先锋2020色资源网_亚洲精品社区_在线免费观看av网站_国产一区二区伦理_亚洲欧美视频一区二区_99视频精品全部免费在线_精精国产xxxx视频在线

基于B-樹和B+樹的使用:數(shù)據(jù)搜索和數(shù)據(jù)庫索引的詳細介紹_Mssql數(shù)據(jù)庫教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:sql server多行數(shù)據(jù)拼接的實例方法
sql server多行數(shù)據(jù)拼接的實例方法,需要的朋友可以參考一下

B-樹

1 .B-樹定義

B-樹是一種平衡的多路查找樹,它在文件系統(tǒng)中很有用。

定義:一棵m 階的B-樹,或者為空樹,或為滿足下列特性的m 叉樹:
⑴樹中每個結(jié)點至多有m 棵子樹;
⑵若根結(jié)點不是葉子結(jié)點,則至少有兩棵子樹;

⑶除根結(jié)點之外的所有非終端結(jié)點至少有[m/2] 棵子樹;
⑷所有的非終端結(jié)點中包含以下信息數(shù)據(jù):

(n,A0,K1,A1,K2,…,Kn,An)
其中:Ki(i=1,2,…,n)為關(guān)鍵碼,且Ki<Ki+1,

Ai 為指向子樹根結(jié)點的指針(i=0,1,…,n),且指針Ai-1 所指子樹中所有結(jié)點的關(guān)鍵碼均小于Ki (i=1,2,…,n),An 所指子樹中所有結(jié)點的關(guān)鍵碼均大于Kn.

n 為關(guān)鍵碼的個數(shù)。
⑸所有的葉子結(jié)點都出現(xiàn)在同一層次上,并且不帶信息(可以看作是外部結(jié)點或查找失敗的結(jié)點,實際上這些結(jié)點不存在,指向這些結(jié)點的指針為空)。

即所有葉節(jié)點具有相同的深度,等于樹高度。

如一棵四階B-樹,其深度為4.


B-樹的查找類似二叉排序樹的查找,所不同的是B-樹每個結(jié)點上是多關(guān)鍵碼的有序表,在到達某個結(jié)點時,先在有序表中查找,若找到,則查找成功;否則,到按照對應(yīng)的指針信息指向的子樹中去查找,當?shù)竭_葉子結(jié)點時,則說明樹中沒有對應(yīng)的關(guān)鍵碼。

在上圖的B-樹上查找關(guān)鍵字47的過程如下:

1)首先從更開始,根據(jù)根節(jié)點指針找到 *節(jié)點,因為 *a 節(jié)點中只有一個關(guān)鍵字,且給定值47 > 關(guān)鍵字35,則若存在必在指針A1所指的子樹內(nèi)。

2)順指針找到 *c節(jié)點,該節(jié)點有兩個關(guān)鍵字(43和 78),而43 < 47 < 78,若存在比在指針A1所指的子樹中。

3)同樣,順指針找到 *g節(jié)點,在該節(jié)點找到關(guān)鍵字47,查找成功。

2. 查找算法

復(fù)制代碼 代碼如下:www.ghpqjb.com

typedef int KeyType ;
#define m 5 /*B 樹的階,暫設(shè)為5*/
typedef struct Node{
int keynum; /* 結(jié)點中關(guān)鍵碼的個數(shù),即結(jié)點的大小*/
struct Node *parent; /*指向雙親結(jié)點*/
KeyType key[m+1]; /*關(guān)鍵碼向量,0 號單元未用*/
struct Node *ptr[m+1]; /*子樹指針向量*/
Record *recptr[m+1]; /*記錄指針向量*/
}NodeType; /*B 樹結(jié)點類型*/

typedef struct{
NodeType *pt; /*指向找到的結(jié)點*/
int i; /*在結(jié)點中的關(guān)鍵碼序號,結(jié)點序號區(qū)間[1…m]*/
int tag; /* 1:查找成功,0:查找失敗*/
}Result; /*B 樹的查找結(jié)果類型*/

Result SearchBTree(NodeType *t,KeyType kx)
{
/*在m 階B 樹t 上查找關(guān)鍵碼kx,反回(pt,i,tag)。若查找成功,則特征值tag=1,*/
/*指針pt 所指結(jié)點中第i 個關(guān)鍵碼等于kx;否則,特征值tag=0,等于kx 的關(guān)鍵碼記錄*/
/*應(yīng)插入在指針pt 所指結(jié)點中第i 個和第i+1 個關(guān)鍵碼之間*/
p=t;q=NULL;found=FALSE;i=0; /*初始化,p 指向待查結(jié)點,q 指向p 的雙親*/
while(p&&!found)
{ n=p->keynum;i=Search(p,kx); /*在p-->key[1…keynum]中查找*/
if(i>0&&p->key[i]= =kx) found=TRUE; /*找到*/
else {q=p;p=p->ptr[i];}
}
if(found) return (p,i,1); /*查找成功*/
else return (q,i,0); /*查找不成功,反回kx 的插入位置信息*/
}

B- 樹查找算法分析

從查找算法中可以看出, 在B- 樹中進行查找包含兩種基本操作:

( 1) 在B- 樹中查找結(jié)點;

( 2) 在結(jié)點中查找關(guān)鍵字。

由于B- 樹通常存儲在磁盤上, 則前一查找操作是在磁盤上進行的, 而后一查找操作是在內(nèi)存中進行的, 即在磁盤上找到指針p 所指結(jié)點后, 先將結(jié)點中的信息讀入內(nèi)存, 然后再利用順序查找或折半查找查詢等于K 的關(guān)鍵字。顯然, 在磁盤上進行一次查找比在內(nèi)存中進行一次查找的時間消耗多得多.

因此, 在磁盤上進行查找的次數(shù)、即待查找關(guān)鍵字所在結(jié)點在B- 樹上的層次樹, 是決定B樹查找效率的首要因素

那么,對含有n 個關(guān)鍵碼的m 階B-樹,最壞情況下達到多深呢?可按二叉平衡樹進行類似分析。首先,討論m 階B-數(shù)各層上的最少結(jié)點數(shù)。

由B樹定義:B樹包含n個關(guān)鍵字。因此有n+1個樹葉都在第J+1 層。

1)第一層為根,至少一個結(jié)點,根至少有兩個孩子,因此在第二層至少有兩個結(jié)點。

2)除根和樹葉外,其它結(jié)點至少有[m/2]個孩子,因此第三層至少有2*[m/2]個結(jié)點,在第四層至少有2*[m/2]2 個結(jié)點…

3)那么在第J+1層至少有2*[m/2]J-1個結(jié)點,而J+1層的結(jié)點為葉子結(jié)點,于是葉子結(jié)點的個數(shù)n+1。有:

也就是說在n個關(guān)鍵字的B樹查找,從根節(jié)點到關(guān)鍵字所在的節(jié)點所涉及的節(jié)點數(shù)不超過:


3.B-樹的插入

B-樹的生成也是從空樹起,逐個插入關(guān)鍵字而得。但由于B-樹結(jié)點中的關(guān)鍵字個數(shù)必須≥ceil(m/2)-1,因此,每次插入一個關(guān)鍵字不是在樹中添加一個葉子結(jié)點,而是首先在最低層的某個非終端結(jié)點中添加一個關(guān)鍵字,若該結(jié)點的關(guān)鍵字個數(shù)不超過m-1,則插入完成,否則要產(chǎn)生結(jié)點的“分裂”,

如圖(a) 為3階的B-樹(圖中略去F結(jié)點(即葉子結(jié)點)),假設(shè)需依次插入關(guān)鍵字30,26,85。



1) 首先通過查找確定插入的位置。由根*a 起進行查找,確定30應(yīng)插入的在*d 節(jié)點中。由于*d 中關(guān)鍵字數(shù)目不超過2(即m-1),故第一個關(guān)鍵字插入完成:如(b)


2) 同樣,通過查找確定關(guān)鍵字26亦應(yīng)插入 *d. 由于*d節(jié)點關(guān)鍵字數(shù)目超過2,此時需要將 *d分裂成兩個節(jié)點,關(guān)鍵字26及其前、后兩個指針仍保留在 *d 節(jié)點中,而關(guān)鍵字37 及其前、后兩個指針存儲到新的產(chǎn)生的節(jié)點 *d` 中。同時將關(guān)鍵字30 和指示節(jié)點 *d `的指針插入到其雙親的節(jié)點中。由于 *b節(jié)點中的關(guān)鍵字數(shù)目沒有超過2,則插入完成.如(c)(d)




3) (e) -(g) 為插入85后;


插入算法:

復(fù)制代碼 代碼如下:www.ghpqjb.com

int InserBTree(NodeType **t,KeyType kx,NodeType *q,int i){
/* 在m 階B 樹*t 上結(jié)點*q 的key[i],key[i+1]之間插入關(guān)鍵碼kx*/
/*若引起結(jié)點過大,則沿雙親鏈進行必要的結(jié)點分裂調(diào)整,使*t仍為m 階B 樹*/
x=kx;ap=NULL;finished=FALSE;
while(q&&!finished)
{
Insert(q,i,x,ap); /*將x 和ap 分別插入到q->key[i+1]和q->ptr[i+1]*/
if(q->keynum<m) finished=TRUE; /*插入完成*/
else
{ /*分裂結(jié)點*p*/
s=m/2;split(q,ap);x=q->key[s];
/*將q->key[s+1…m],q->ptr[s…m]和q->recptr[s+1…m]移入新結(jié)點*ap*/
q=q->parent;
if(q) i=Search(q,kx); /*在雙親結(jié)點*q 中查找kx 的插入位置*/
}
}
if(!finished) /*(*t)是空樹或根結(jié)點已分裂為*q*和ap*/
NewRoot(t,q,x,ap); /*生成含信息(t,x,ap)的新的根結(jié)點*t,原*t 和ap 為子樹指針*/
}

4. B-樹的刪除

反之,若在B-樹上刪除一個關(guān)鍵字,則首先應(yīng)找到該關(guān)鍵字所在結(jié)點,并從中刪除之,若該結(jié)點為最下層的非終端結(jié)點,且其中的關(guān)鍵字數(shù)目不少于ceil(m/2),則刪除完成,否則要進行“合并”結(jié)點的操作。假若所刪關(guān)鍵字為非終端結(jié)點中的Ki,則可以指針Ai所指子樹中的最小關(guān)鍵字Y替代Ki,然后在相應(yīng)的結(jié)點中刪去Y。例如,在下圖 圖4.1( a)的B-樹上刪去45,可以*f結(jié)點中的50替代45,然后在*f結(jié)點中刪去50。


圖4.1( a)

因此,下面我們可以只需討論刪除最下層非終端結(jié)點中的關(guān)鍵字的情形。有下列三種可能:

(1)被刪關(guān)鍵字所在結(jié)點中的關(guān)鍵字數(shù)目不小于ceil(m/2),則只需從該結(jié)點中刪去該關(guān)鍵字Ki和相應(yīng)指針Ai,樹的其它部分不變,例如,從圖 圖4.1( a)所示B-樹中刪去關(guān)鍵字12,刪除后的B-樹如圖 圖4.2( a)所示:


圖4.2( a)

(2)被刪關(guān)鍵字所在結(jié)點中的關(guān)鍵字數(shù)目等于ceil(m/2)-1,而與該結(jié)點相鄰的右兄弟(或左兄弟)結(jié)點中的關(guān)鍵字數(shù)目大于ceil(m/2)-1,則需將其兄弟結(jié)點中的最小(或最大)的關(guān)鍵字上移至雙親結(jié)點中,而將雙親結(jié)點中小于(或大于)且緊靠該上移關(guān)鍵字的關(guān)鍵字下移至被刪關(guān)鍵字所在結(jié)點中。

[例如],從圖圖4.2( a)中刪去50,需將其右兄弟結(jié)點中的61上移至*e結(jié)點中,而將*e結(jié)點中的53移至*f,從而使*f和*g中關(guān)鍵字數(shù)目均不小于ceil(m-1)-1,而雙親結(jié)點中的關(guān)鍵字數(shù)目不變,如圖圖4.2(b)所示。


圖4.2(b)

(3)被刪關(guān)鍵字所在結(jié)點和其相鄰的兄弟結(jié)點中的關(guān)鍵字數(shù)目均等于ceil(m/2)-1。假設(shè)該結(jié)點有右兄弟,且其右兄弟結(jié)點地址由雙親結(jié)點中的指針Ai所指,則在刪去關(guān)鍵字之后,它所在結(jié)點中剩余的關(guān)鍵字和指針,加上雙親結(jié)點中的關(guān)鍵字Ki一起,合并到 Ai所指兄弟結(jié)點中(若沒有右兄弟,則合并至左兄弟結(jié)點中)。

[例如],從圖4.2(b)所示 B-樹中刪去53,則應(yīng)刪去*f結(jié)點,并將*f中的剩余信息(指針“空”)和雙親*e結(jié)點中的 61一起合并到右兄弟結(jié)點*g中。刪除后的樹如圖4.2(c)所示。

圖4.2(c)

如果因此使雙親結(jié)點中的關(guān)鍵字數(shù)目小于ceil(m/2)-1,則依次類推。

[例如],在 圖4.2(c)的B-樹中刪去關(guān)鍵字37之后,雙親b結(jié)點中剩余信息(“指針c”)應(yīng)和其雙親*a結(jié)點中關(guān)鍵字45一起合并至右兄弟結(jié)點*e中,刪除后的B-樹如圖 4.2(d)所示。

圖 4.2(d)


B-樹主要應(yīng)用在文件系統(tǒng)

為了將大型數(shù)據(jù)庫文件存儲在硬盤上 以減少訪問硬盤次數(shù)為目的 在此提出了一種平衡多路查找樹——B-樹結(jié)構(gòu) 由其性能分析可知它的檢索效率是相當高的 為了提高 B-樹性能'還有很多種B-樹的變型,力圖對B-樹進行改進


B+樹 B+樹是應(yīng)文件系統(tǒng)所需而產(chǎn)生的一種B-樹的變形樹。一棵m 階的B+樹和m 階的B-
樹的差異在于:
⑴有n 棵子樹的結(jié)點中含有n 個關(guān)鍵碼;
⑵所有的葉子結(jié)點中包含了全部關(guān)鍵碼的信息,及指向含有這些關(guān)鍵碼記錄的指針,且
葉子結(jié)點本身依關(guān)鍵碼的大小自小而大的順序鏈接。
⑶所有的非終端結(jié)點可以看成是索引部分,結(jié)點中僅含有其子樹根結(jié)點中最大(或最小)關(guān)鍵碼。
如圖一棵3階的B+樹:

通常在B+樹上有兩個頭指針,一個指向根節(jié)點,另一個指向關(guān)鍵字最小的葉子節(jié)點。因此可以對B+樹進行兩種查找運算:一種是從最小關(guān)鍵字起順序查找,另一種是從根節(jié)點開始,進行隨機查找。
在B+樹上進行隨機查找、插入和刪除的過程基本上與B-樹類似。只是在查找時,若非終端結(jié)點上的關(guān)鍵碼等于給定值,并不終止,而是繼續(xù)向下直到葉子結(jié)點。因此,在B+
樹,不管查找成功與否,每次查找都是走了一條從根到葉子結(jié)點的路徑。

B+樹在數(shù)據(jù)庫中的應(yīng)用

1. 索引在數(shù)據(jù)庫中的作用

在數(shù)據(jù)庫系統(tǒng)的使用過程當中,數(shù)據(jù)的查詢是使用最頻繁的一種數(shù)據(jù)操作。

最基本的查詢算法當然是順序查找(linear search),遍歷表然后逐行匹配行值是否等于待查找的關(guān)鍵字,其時間復(fù)雜度為O(n)。但時間復(fù)雜度為O(n)的算法規(guī)模小的表,負載輕的數(shù)據(jù)庫,也能有好的性能。 但是數(shù)據(jù)增大的時候,時間復(fù)雜度為O(n)的算法顯然是糟糕的,性能就很快下降了。

好在計算機科學(xué)的發(fā)展提供了很多更優(yōu)秀的查找算法,例如二分查找(binary search)、二叉樹查找(binary tree search)等。如果稍微分析一下會發(fā)現(xiàn),每種查找算法都只能應(yīng)用于特定的數(shù)據(jù)結(jié)構(gòu)之上,例如二分查找要求被檢索數(shù)據(jù)有序,而二叉樹查找只能應(yīng)用于二叉查找樹上,但是數(shù)據(jù)本身的組織結(jié)構(gòu)不可能完全滿足各種數(shù)據(jù)結(jié)構(gòu)(例如,理論上不可能同時將兩列都按順序進行組織),所以,在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實現(xiàn)高級查找算法。這種數(shù)據(jù)結(jié)構(gòu),就是索引。

索引是對數(shù)據(jù)庫表 中一個或多個列的值進行排序的結(jié)構(gòu)。與在表 中搜索所有的行相比,索引用指針 指向存儲在表中指定列的數(shù)據(jù)值,然后根據(jù)指定的次序排列這些指針,有助于更快地獲取信息。通常情 況下 ,只有當經(jīng)常查詢索引列中的數(shù)據(jù)時 ,才需要在表上創(chuàng)建索引。索引將占用磁盤空間,并且影響數(shù) 據(jù)更新的速度。但是在多數(shù)情況下 ,索引所帶來的數(shù)據(jù)檢索速度優(yōu)勢大大超過它的不足之處。

2. B+樹在數(shù)據(jù)庫索引中的應(yīng)用


目前大部分數(shù)據(jù)庫系統(tǒng)及文件系統(tǒng)都采用B-Tree或其變種B+Tree作為索引結(jié)構(gòu)

1)在數(shù)據(jù)庫索引的應(yīng)用

在數(shù)據(jù)庫索引的應(yīng)用中,B+樹按照下列方式進行組織 :

① 葉結(jié)點的組織方式 。B+樹的查找鍵 是數(shù)據(jù)文件的主鍵 ,且索引是稠密的。也就是說 ,葉結(jié)點 中為數(shù)據(jù)文件的第一個記錄設(shè)有一個鍵、指針對 ,該數(shù)據(jù)文件可以按主鍵排序,也可以不按主鍵排序 ;數(shù)據(jù)文件按主鍵排序,且 B +樹是稀疏索引 , 在葉結(jié)點中為數(shù)據(jù)文件的每一個塊設(shè)有一個鍵、指針對 ;數(shù)據(jù)文件不按鍵屬性排序 ,且該屬性是 B +樹 的查找鍵 , 葉結(jié)點中為數(shù)據(jù)文件里出現(xiàn)的每個屬性K設(shè)有一個鍵 、 指針對 , 其中指針執(zhí)行排序鍵值為 K的 記錄中的第一個。

② 非葉結(jié)點 的組織方式。B+樹 中的非葉結(jié)點形成 了葉結(jié)點上的一個多級稀疏索引。 每個非葉結(jié)點中至少有ceil( m/2 ) 個指針 , 至多有 m 個指針 。

2)B+樹索引的插入和刪除

①在向數(shù)據(jù)庫中插入新的數(shù)據(jù)時,同時也需要向數(shù)據(jù)庫索引中插入相應(yīng)的索引鍵值 ,則需要向 B+樹 中插入新的鍵值。即上面我們提到的B-樹插入算法。

②當從數(shù)據(jù)庫中刪除數(shù)據(jù)時,同時也需要從數(shù)據(jù)庫索引中刪除相應(yīng)的索引鍵值 ,則需要從 B+樹 中刪 除該鍵值 。即B-樹刪除算法

為什么使用B-Tree(B+Tree)

二叉查找樹進化品種的紅黑樹等數(shù)據(jù)結(jié)構(gòu)也可以用來實現(xiàn)索引,但是文件系統(tǒng)及數(shù)據(jù)庫系統(tǒng)普遍采用B-/+Tree作為索引結(jié)構(gòu)。

 一般來說,索引本身也很大,不可能全部存儲在內(nèi)存中,因此索引往往以索引文件的形式存儲的磁盤上。這樣的話,索引查找過程中就要產(chǎn)生磁盤I/O消耗,相對于內(nèi)存存取,I/O存取的消耗要高幾個數(shù)量級,所以評價一個數(shù)據(jù)結(jié)構(gòu)作為索引的優(yōu)劣最重要的指標就是在查找過程中磁盤I/O操作次數(shù)的漸進復(fù)雜度。換句話說,索引的結(jié)構(gòu)組織要盡量減少查找過程中磁盤I/O的存取次數(shù)。為什么使用B-/+Tree,還跟磁盤存取原理有關(guān)。

局部性原理與磁盤預(yù)讀

  由于存儲介質(zhì)的特性,磁盤本身存取就比主存慢很多,再加上機械運動耗費,磁盤的存取速度往往是主存的幾百分分之一,因此為了提高效率,要盡量減少磁盤I/O。為了達到這個目的,磁盤往往不是嚴格按需讀取,而是每次都會預(yù)讀,即使只需要一個字節(jié),磁盤也會從這個位置開始,順序向后讀取一定長度的數(shù)據(jù)放入內(nèi)存。這樣做的理論依據(jù)是計算機科學(xué)中著名的局部性原理:

  當一個數(shù)據(jù)被用到時,其附近的數(shù)據(jù)也通常會馬上被使用。

  程序運行期間所需要的數(shù)據(jù)通常比較集中。

  由于磁盤順序讀取的效率很高(不需要尋道時間,只需很少的旋轉(zhuǎn)時間),因此對于具有局部性的程序來說,預(yù)讀可以提高I/O效率。

  預(yù)讀的長度一般為頁(page)的整倍數(shù)。頁是計算機管理存儲器的邏輯塊,硬件及操作系統(tǒng)往往將主存和磁盤存儲區(qū)分割為連續(xù)的大小相等的塊,每個存儲塊稱為一頁(在許多操作系統(tǒng)中,頁得大小通常為4k),主存和磁盤以頁為單位交換數(shù)據(jù)。當程序要讀取的數(shù)據(jù)不在主存中時,會觸發(fā)一個缺頁異常,此時系統(tǒng)會向磁盤發(fā)出讀盤信號,磁盤會找到數(shù)據(jù)的起始位置并向后連續(xù)讀取一頁或幾頁載入內(nèi)存中,然后異常返回,程序繼續(xù)運行。

我們上面分析B-/+Tree檢索一次最多需要訪問節(jié)點:

h =

數(shù)據(jù)庫系統(tǒng)巧妙利用了磁盤預(yù)讀原理,將一個節(jié)點的大小設(shè)為等于一個頁,這樣每個節(jié)點只需要一次I/O就可以完全載入。為了達到這個目的,在實際實現(xiàn)B- Tree還需要使用如下技巧:

每次新建節(jié)點時,直接申請一個頁的空間,這樣就保證一個節(jié)點物理上也存儲在一個頁里,加之計算機存儲分配都是按頁對齊的,就實現(xiàn)了一個node只需一次I/O。

  B-Tree中一次檢索最多需要h-1次I/O(根節(jié)點常駐內(nèi)存),漸進復(fù)雜度為O(h)=O(logmN)。一般實際應(yīng)用中,m是非常大的數(shù)字,通常超過100,因此h非常。ㄍǔ2怀^3)。

  綜上所述,用B-Tree作為索引結(jié)構(gòu)效率是非常高的。

  而紅黑樹這種結(jié)構(gòu),h明顯要深的多。由于邏輯上很近的節(jié)點(父子)物理上可能很遠,無法利用局部性,所以紅黑樹的I/O漸進復(fù)雜度也為O(h),效率明顯比B-Tree差很多。

MySQL的B-Tree索引(技術(shù)上說B+Tree)

在 MySQL 中,主要有四種類型的索引,分別為: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引。我們主要分析B-Tree 索引。

B-Tree 索引是 MySQL 數(shù)據(jù)庫中使用最為頻繁的索引類型,除了 Archive 存儲引擎之外的其他所有的存儲引擎都支持 B-Tree 索引。Archive 引擎直到 MySQL 5.1 才支持索引,而且只支持索引單個 AUTO_INCREMENT 列。

不僅僅在 MySQL 中是如此,實際上在其他的很多數(shù)據(jù)庫管理系統(tǒng)中B-Tree 索引也同樣是作為最主要的索引類型,這主要是因為 B-Tree 索引的存儲結(jié)構(gòu)在數(shù)據(jù)庫的數(shù)據(jù)檢索中有非常優(yōu)異的表現(xiàn)。

一般來說, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的結(jié)構(gòu)來存儲的,也就是所有實際需要的數(shù)據(jù)都存放于 Tree 的 Leaf Node(葉子節(jié)點) ,而且到任何一個 Leaf Node 的最短路徑的長度都是完全相同的,所以我們大家都稱之為 B-Tree 索引。當然,可能各種數(shù)據(jù)庫(或 MySQL 的各種存儲引擎)在存放自己的 B-Tree 索引的時候會對存儲結(jié)構(gòu)稍作改造。如 Innodb 存儲引擎的 B-Tree 索引實際使用的存儲結(jié)構(gòu)實際上是 B+Tree,也就是在 B-Tree 數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上做了很小的改造,在每一個Leaf Node 上面出了存放索引鍵的相關(guān)信息之外,還存儲了指向與該 Leaf Node 相鄰的后一個 LeafNode 的指針信息(增加了順序訪問指針),這主要是為了加快檢索多個相鄰 Leaf Node 的效率考慮。

下面主要討論MyISAM和InnoDB兩個存儲引擎的索引實現(xiàn)方式:

1. MyISAM索引實現(xiàn):

1)主鍵索引:

MyISAM引擎使用B+Tree作為索引結(jié)構(gòu),葉節(jié)點的data域存放的是數(shù)據(jù)記錄的地址。下圖是MyISAM主鍵索引的原理圖:


(圖myisam1)

這里設(shè)表一共有三列,假設(shè)我們以Col1為主鍵,圖myisam1是一個MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件僅僅保存數(shù)據(jù)記錄的地址。

2)輔助索引(Secondary key)

在MyISAM中,主索引和輔助索引(Secondary key)在結(jié)構(gòu)上沒有任何區(qū)別,只是主索引要求key是唯一的,而輔助索引的key可以重復(fù)。如果我們在Col2上建立一個輔助索引,則此索引的結(jié)構(gòu)如下圖所示:

同樣也是一顆B+Tree,data域保存數(shù)據(jù)記錄的地址。因此,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應(yīng)數(shù)據(jù)記錄。

MyISAM的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與InnoDB的聚集索引區(qū)分。

2. InnoDB索引實現(xiàn)

然InnoDB也使用B+Tree作為索引結(jié)構(gòu),但具體實現(xiàn)方式卻與MyISAM截然不同.

1)主鍵索引:

MyISAM索引文件和數(shù)據(jù)文件是分離的,索引文件僅保存數(shù)據(jù)記錄的地址。而在InnoDB中,表數(shù)據(jù)文件本身就是按B+Tree組織的一個索引結(jié)構(gòu),這棵樹的葉節(jié)點data域保存了完整的數(shù)據(jù)記錄。這個索引的key是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。

(圖inndb主鍵索引)

(圖inndb主鍵索引)是InnoDB主索引(同時也是數(shù)據(jù)文件)的示意圖,可以看到葉節(jié)點包含了完整的數(shù)據(jù)記錄。這種索引叫做聚集索引。因為InnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統(tǒng)會自動選擇一個可以唯一標識數(shù)據(jù)記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節(jié),類型為長整形。

2). InnoDB的輔助索引

InnoDB的所有輔助索引都引用主鍵作為data域。例如,下圖為定義在Col3上的一個輔助索引:

InnoDB 表是基于聚簇索引建立的。因此InnoDB 的索引能提供一種非常快速的主鍵查找性能。不過,它的輔助索引(Secondary Index, 也就是非主鍵索引)也會包含主鍵列,所以,如果主鍵定義的比較大,其他索引也將很大。如果想在表上定義 、很多索引,則爭取盡量把主鍵定義得小一些。InnoDB 不會壓縮索引。

文字符的ASCII碼作為比較準則。聚集索引這種實現(xiàn)方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。

不同存儲引擎的索引實現(xiàn)方式對于正確使用和優(yōu)化索引都非常有幫助,例如知道了InnoDB的索引實現(xiàn)后,就很容易明白為什么不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,用非單調(diào)的字段作為主鍵在InnoDB中不是個好主意,因為InnoDB數(shù)據(jù)文件本身是一顆B+Tree,非單調(diào)的主鍵會造成在插入新記錄時數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調(diào)整,十分低效,而使用自增字段作為主鍵則是一個很好的選擇。

InnoDB索引和MyISAM索引的區(qū)別:

一是主索引的區(qū)別,InnoDB的數(shù)據(jù)文件本身就是索引文件。而MyISAM的索引和數(shù)據(jù)是分開的。

二是輔助索引的區(qū)別:InnoDB的輔助索引data域存儲相應(yīng)記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區(qū)別。

分享:asp.net連接查詢SQL數(shù)據(jù)庫并把結(jié)果顯示在網(wǎng)頁上(2種方法)
使用C#連接SQL數(shù)據(jù)庫,并使用SQL語句查詢,摸索了兩天終于運行起來了,接下來為大家分享下兩種連接方法,感興趣的朋友可以參考下哈,希望可以幫助到你

來源:模板無憂//所屬分類:Mssql數(shù)據(jù)庫教程/更新時間:2013-04-28
相關(guān)Mssql數(shù)據(jù)庫教程
久久av一区| wwwav网站| 成人午夜av| 国产精品麻豆一区二区| 美日韩精品免费观看视频| 国产欧美综合一区| 精品无码免费视频| 九九在线精品| 亚洲天天做日日做天天谢日日欢 | 日韩精品免费一区| 中文字幕一区二区三区精品| 国产精品手机在线播放| 综合久久一区二区三区| 欧美日韩成人精品| 亚洲中文字幕无码不卡电影| 夜夜骚av一区二区三区| 精品999网站| 欧洲亚洲精品在线| 国产精品毛片一区视频| 国产一区二区三区精品在线| 国产精品香蕉| 国产精品久久久久久久久果冻传媒| 欧美大片免费看| 无码内射中文字幕岛国片| av中文字幕在线免费观看| 久久综合激情| 欧美mv日韩mv| 一区高清视频| 激情视频网站在线观看| 欧美精品激情| 欧美日韩一二三| 你懂的网址一区二区三区| 欧美日韩黄色网| 国产欧美高清视频在线| 亚洲午夜在线电影| 成人免费视频在线观看超级碰| 六十路息与子猛烈交尾| 日韩一级淫片| 久久久久久久久久久网| va婷婷在线免费观看| 日韩中文字幕麻豆| 精品国产乱码久久久久久闺蜜| 亚洲精品乱码视频| 天码人妻一区二区三区在线看 | 国产欧美一级| 日韩一级片在线观看| 午夜精品美女久久久久av福利| 国产精品第二十页| 欧美精品福利| 欧美一区二区三区婷婷月色| 图片区小说区区亚洲五月| 可以免费在线观看的av| 日韩一区二区久久| 欧美成人r级一区二区三区| 天堂av免费看| 亚洲天堂网在线观看视频| 男人操女人的视频在线观看欧美| 精品视频在线导航| 国产h视频在线播放| 黄色a在线观看| 成人激情小说乱人伦| 欧美日韩国产成人高清视频| 亚洲熟女乱综合一区二区| 视频精品二区| 亚洲一级二级三级在线免费观看| 亚洲aa在线观看| 男女性高潮免费网站| 一区二区三区网站| 日韩女优av电影在线观看| 日本三日本三级少妇三级66| 国产视频一二三四区| 国产一区亚洲一区| 九九视频直播综合网| 蜜桃视频无码区在线观看| 99久久香蕉| 午夜精彩视频在线观看不卡| 高清国产在线一区| 奇米影视第四色777| 可以免费看不卡的av网站| 一个色综合导航| av污在线观看| 久久爱www.| 亚洲成人一区在线| 久久久久久久久久久久久久一区| 无码人妻精品一区二区三区9厂| 日本aⅴ精品一区二区三区| 精品国产一区久久久| 99中文字幕在线| 日本精品国产| 欧美体内谢she精2性欧美| 奇米精品在线| 国产精品久久久久久久一区二区 | 国产亚洲午夜高清国产拍精品| 国产精品678| 国产67194| 在线视频精品| 中文字幕欧美在线| 亚洲911精品成人18网站| 日韩av午夜| 欧美性大战久久久久久久蜜臀| 咪咪色在线视频| 亚洲黄色a级片| 中文av一区二区| 超碰97网站| 91久久国产综合久久91| 国产做a爰片久久毛片| 97国产在线视频| 亚洲黄色网址大全| 国产精品hd| 尤物99国产成人精品视频| 乳色吐息在线观看| 欧洲激情综合| 亚洲国产欧美精品| 波多野结衣国产精品| 少妇久久久久| 欧美一二三区在线| 欧美一级黄色片视频| 美女国产精品久久久| 91电影在线观看| 国产一区二区三区在线免费| jizz久久久久久| 激情久久av一区av二区av三区| 亚洲国产精品视频一区| 熟妇高潮一区二区高潮| 一区二区三区在线观看网站| 日本一区网站| 色窝窝无码一区二区三区成人网站| 国产精品久久久久影院老司| 精品一区久久| wwwav在线播放| 综合电影一区二区三区| 日韩在线观看电影完整版高清免费| 欧美 日韩 国产 精品| 国产欧美一区二区精品仙草咪 | 久久久久亚洲天堂| 制服下的诱惑暮生| 精品国产二区在线| www国产视频| 亚洲国产不卡| 亚洲女同精品视频| 中国一级黄色录像| 亚洲一区二区三区四区五区六区| 日韩欧美中字| 亚洲天堂精品在线| 欧美日韩国产bt| 精品国产一区二区三区麻豆小说| 国产精品久久久久久久成人午夜| 国产欧美精品日韩区二区麻豆天美| 国模一区二区三区私拍视频| 精品黑人一区二区三区在线观看| 成人免费在线播放视频| 一区精品在线| 57pao成人永久免费| 欧美日韩日本视频| 日韩一级理论片| 成人激情在线| 在线播放日韩精品| gv天堂gv无码男同在线观看| 免费高清不卡av| 国产精品专区一| 中文字幕一区二区三区四区免费看 | 91精品一久久香蕉国产线看观看| 亚洲地区一二三色| av网站手机在线观看| 成人av激情人伦小说| 精品国产乱码久久久久久久久| 一区二区三区四区影院| 伊人激情综合| 欧美一区深夜视频| av网站中文字幕| 国产天堂亚洲国产碰碰| 日本一区免费观看| 五月天色综合| 欧美成人三级在线| 朝桐光av一区二区三区| 手机精品视频在线观看| 国产精品丝袜久久久久久高清| 中文字幕人妻一区二区在线视频| 国产精品女人毛片| 日韩精品一区二区三区电影| 91精品尤物| 国产视频一区在线| 久久全球大尺度高清视频| 久久手机在线视频| 伊人精品一区| 日韩中文字幕精品| 欧美精品一区二区蜜桃| 99国产精品一区| 婷婷精品国产一区二区三区日韩| 四虎国产精品免费久久5151| 精品国产一区a| 亚洲天堂久久新| 久久91精品国产91久久小草| 成人动漫视频在线观看完整版| 天天操天天干天天爱| 欧洲国产伦久久久久久久| 樱花草www在线| 国产一区91| 成人福利网站在线观看11| 成人小说亚洲一区二区三区| 色狠狠桃花综合| www激情五月| 久久久精品日韩| 91精品久久香蕉国产线看观看| 日本免费不卡视频| 欧美高清视频一二三区| 精品无码国产一区二区三区51安| 韩国一区二区在线观看| 欧美不卡1区2区3区| 国产精品一区二区精品视频观看| 日韩av最新在线观看| 国产精品夜夜夜爽阿娇| 91视频免费播放| 玖玖精品在线视频| 国内黄色精品| 97国产在线观看| 99久久久久成人国产免费| 色婷婷综合久久久久中文一区二区 | 久热精品视频| 成人黄色网免费| 成人欧美大片| 欧美一级高清片在线观看| 日韩在线免费观看av| 成人中文字幕合集| www.午夜色| 欧美伦理在线视频| 69久久夜色精品国产69| 精品国自产在线观看| 欧美老女人第四色| 国产aⅴ激情无码久久久无码| 丁香天五香天堂综合| 婷婷视频在线播放| 久久理论电影| 日韩免费视频在线观看| 天天av天天翘| 精品美女被调教视频大全网站| 日韩精品一区二区三区在线视频| 国产日韩欧美精品电影三级在线| 男人插女人视频在线观看| 国产精品mm| 亚洲自拍av在线| 二区三区精品| 色婷婷久久av| 中文字幕在线视频第一页| 91官网在线免费观看| 亚洲av无码国产精品久久| 99久久精品国产一区| 久久这里只有精品8| 女人天堂亚洲aⅴ在线观看| 成人av在线亚洲| 亚洲欧洲一二区| 日韩在线观看免费网站| 中文字幕永久在线观看| 欧美日韩国产不卡| 91麻豆精品久久毛片一级| 国产精品视频yy9299一区| 天天干天天干天天干天天干天天干| 天堂在线一区二区| 日本视频一区二区不卡| 精品美女视频| 国产精品日韩在线| 国产精品久久久久久久久久齐齐| 中文字幕日本欧美| 在线观看国产一区二区三区| 欧美精品在线一区二区三区| 国产午夜手机精彩视频| 亚洲一区在线看| 男男做爰猛烈叫床爽爽小说 | 日韩成人高清视频| 欧美性猛xxx| 91视频免费在观看| 亚洲三级电影网站| 岛国精品一区二区三区| 91蜜桃免费观看视频| 欧美精品一区二区三区免费播放| 七七婷婷婷婷精品国产| 中文字幕精品一区日韩| 国产一区观看| 精品一区二区视频| 三区四区不卡| yellow视频在线观看一区二区 | 午夜精品久久99蜜桃的功能介绍| 波多野结衣精品久久| 亚洲精品国产精品粉嫩| 国产精品丝袜视频| 国产图片一区| 国产精品第100页| 欧美日韩中出| 欧美一区二区.| 99国内精品久久久久| 久久久久免费视频| 黄色成人在线视频| 九九热r在线视频精品| 无码h黄肉3d动漫在线观看| 中文字幕欧美精品日韩中文字幕| 精品人妻av一区二区三区| 日韩精品中文字幕视频在线| 91在线你懂的| 亚洲娇小xxxx欧美娇小| 在线观看国产黄| 亚洲精品美女久久久| 一级黄色短视频| 亚洲精品xxx| 91资源在线视频| 亚洲欧美资源在线| 亚洲精品国产精品国| 中文字幕亚洲无线码在线一区| 亚洲老妇色熟女老太| 日韩中文在线中文网三级| 色欲av伊人久久大香线蕉影院| 中文日韩电影网站| 凸凹人妻人人澡人人添| 久久久91精品国产一区不卡| 欧洲av不卡| 欧美成人精品在线观看| 狠狠久久综合| 欧美综合第一页| xxxxxhd亚洲人hd| 国产精品视频导航| 日韩手机在线| 国产超碰91| 一区二区三区四区日韩| 亚洲欧美成人一区| 亚洲欧美日本国产专区一区| 国产91在线亚洲| 国内欧美视频一区二区| 国产九九在线视频| 国产亚洲精品bt天堂精选| 国产chinese中国hdxxxx| 亚洲精品成人天堂一二三| 日本爱爱小视频| 欧美三级视频在线| 日本中文字幕久久| 日韩av网站导航| 少妇精品高潮欲妇又嫩中文字幕 | www.毛片.com| 亚洲国产成人av在线| 亚洲AV无码一区二区三区性| 欧美另类在线播放| 日本一区二区三区电影免费观看| 国产精品亚洲美女av网站| 成人网18免费网站| 亚洲va久久久噜噜噜久久狠狠| 巨乳诱惑日韩免费av| 中文字幕乱码人妻综合二区三区| 99精品热视频| 漂亮人妻被黑人久久精品| 午夜亚洲福利老司机| 日韩免费一级片| 欧美一区二区久久| 国产欧美第一页| 久99久在线视频| 国产精品15p| 国产区日韩欧美| 亚洲深夜影院| 成年人观看网站| 国产婷婷一区二区| 天天操天天干天天操天天干| 欧美日韩你懂得| 国产片在线播放| 欧美—级a级欧美特级ar全黄 | 亚洲一二三四在线观看| 麻豆视频在线观看| 精品久久久久一区| 无码国产色欲xxxx视频| 欧美影院在线播放| 欧美天天综合| 久久久久亚洲av无码专区喷水| 国产一区二区美女| 图片区偷拍区小说区| 福利一区福利二区微拍刺激| 日本天堂网在线| 尤物精品国产第一福利三区| 日本午夜免费一区二区| 91日韩在线播放| 亚洲九九精品| 无码人妻丰满熟妇区毛片| 中文字幕av一区 二区| 国产黄在线免费观看| 日韩高清中文字幕| 玖玖精品在线| 国产精品日韩欧美一区二区| 免费国产自线拍一欧美视频| 亚洲激情在线观看视频| 一区二区免费看| 久久久久女人精品毛片九一| 色综合伊人色综合网| av成人资源| 日本一区免费| 丁香婷婷综合五月| 91激情视频在线观看| 日韩色在线观看| 国产精品专区免费| 91天堂在线观看| 国产精品综合| 日韩av福利在线观看| 欧美香蕉大胸在线视频观看| 国产精品人人妻人人爽| 91高清视频在线免费观看| 99久久亚洲精品|