新聞中心
在數(shù)據(jù)庫中,關(guān)系型數(shù)據(jù)庫設(shè)計的重要性不言而喻,外鍵就是其中一個關(guān)鍵的設(shè)計元素。外鍵是一種在一個表中創(chuàng)建的關(guān)系,該關(guān)系指向另一個表中的主鍵。這種關(guān)系是通過在表之間相應(yīng)的字段定義的約束來實現(xiàn)的。外鍵的使用有很多好處,包括確保數(shù)據(jù)完整性和減少數(shù)據(jù)冗余。但是,對于一個海量數(shù)據(jù)的系統(tǒng),如果不對外鍵字段建立索引,那么查詢操作的效率將會受到很大的影響。因此,本文將對外鍵數(shù)據(jù)庫索引的創(chuàng)建方法進(jìn)行詳細(xì)介紹。

創(chuàng)新互聯(lián)成立以來不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點,以客戶需求中心、市場為導(dǎo)向”的快速反應(yīng)體系。對公司的主營項目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計、行業(yè) / 企業(yè)門戶設(shè)計推廣、行業(yè)門戶平臺運營、app軟件開發(fā)公司、手機網(wǎng)站制作、微信網(wǎng)站制作、軟件開發(fā)、達(dá)州托管服務(wù)器等實行標(biāo)準(zhǔn)化操作,讓客戶可以直觀的預(yù)知到從創(chuàng)新互聯(lián)可以獲得的服務(wù)效果。
一、外鍵概述
外鍵是關(guān)系型數(shù)據(jù)庫的一個重要概念。它是用來定義表之間關(guān)系的一種約束。在主表中,外鍵創(chuàng)建指向從表中與之關(guān)聯(lián)的主鍵。也就是說,外鍵是保證關(guān)系完整性、實體完整性獲取數(shù)據(jù)一致性的一個重要方式。
例如,在一個考試管理系統(tǒng)中,如果要記錄考生的分?jǐn)?shù),那么分?jǐn)?shù)信息就需要與考生信息進(jìn)行關(guān)聯(lián)。此時,在分?jǐn)?shù)表中就需要設(shè)置一個外鍵關(guān)聯(lián)考生表中的主鍵,所以分?jǐn)?shù)表的“考生ID”字段就是外鍵。
二、外鍵索引的必要性
在數(shù)據(jù)庫的實際應(yīng)用中,有多個表之間存在關(guān)聯(lián)關(guān)系。除了在主表中建立外鍵約束以外,還需要在從表中加入索引,以保證數(shù)據(jù)庫操作的性能。對于一個大規(guī)模的系統(tǒng),訪問數(shù)據(jù)的效率的重要性不言而喻,這時候就需要對外鍵字段進(jìn)行索引優(yōu)化。
外鍵索引的建立可以加快查詢速度,并在修改主鍵時自動更新關(guān)聯(lián)外鍵的數(shù)據(jù),保證數(shù)據(jù)的一致性。如果不對外鍵字段創(chuàng)建索引,那么在進(jìn)行數(shù)據(jù)查詢時需要掃描整個表,查詢效率將會非常低下。
三、外鍵索引的創(chuàng)建方法
1. 創(chuàng)建外鍵約束
在建立外鍵索引之前,首先需要建立外鍵約束,也就是在從表中定義一個外鍵,它指向主表的主鍵。創(chuàng)建外鍵約束的SQL語句格式如下:
“`
alter table 從表 add constrnt 命名規(guī)則 foreign key(外鍵字段名) references 主表(主鍵字段名)
“`
2. 在外鍵字段上創(chuàng)建索引
創(chuàng)建外鍵約束之后,需要在對應(yīng)的外鍵字段上創(chuàng)建索引。這個索引可以是單列索引,也可以是多列索引。一般情況下,外鍵字段只需要建立單列索引即可。
SQL語句格式如下:
“`
create index index_name on table_name(column_name);
“`
其中,index_name是自己為索引定義的名稱,table_name是表名,column_name是需要為其創(chuàng)建索引的外鍵字段。
3. 檢查索引
創(chuàng)建索引之后,需要測試索引是否正常工作??梢酝ㄟ^執(zhí)行一個查詢操作來檢查索引是否生效。如果在查詢時可以看到使用了預(yù)期的索引,那么說明索引創(chuàng)建成功。
四、需要注意的事項
1. 不要為所有的外鍵都創(chuàng)建索引。外鍵索引對性能的優(yōu)化有限,因為它們只涉及到一小部分?jǐn)?shù)據(jù)。因此建議只為那些非常頻繁使用的外鍵字段創(chuàng)建索引。
2. 外鍵索引的創(chuàng)建應(yīng)該根據(jù)實際業(yè)務(wù)需要進(jìn)行,并進(jìn)行性能測試以確定其是否真正有用。
3. 外鍵約束的創(chuàng)建應(yīng)該與其他約束同時進(jìn)行。在創(chuàng)建表時應(yīng)該注意約束的順序,因為引用其他表中的主鍵時需要先創(chuàng)建好被引用的表。
外鍵索引可以提高數(shù)據(jù)庫系統(tǒng)的查詢性能,確保數(shù)據(jù)的一致性,因為索引可以使查找特定數(shù)據(jù)更快,減少數(shù)據(jù)冗余。如果需要在關(guān)系型數(shù)據(jù)庫中使用外鍵,那么就必須理解外鍵的概念,并為外鍵字段創(chuàng)建適當(dāng)?shù)乃饕齺硖岣咝阅堋?/p>
相關(guān)問題拓展閱讀:
- 數(shù)據(jù)庫索引的實現(xiàn)原理
數(shù)據(jù)庫索引的實現(xiàn)原理
數(shù)據(jù)庫索引的實現(xiàn)原理
一、概述數(shù)據(jù)庫索引,是數(shù)據(jù)庫管理系統(tǒng)中一個排序的數(shù)據(jù)結(jié)構(gòu),以協(xié)助快速查詢、更新數(shù)據(jù)庫表中數(shù)據(jù)。索引的實現(xiàn)通常使用B樹及其變種B+樹。在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護(hù)著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實現(xiàn)高級查找算法。這種數(shù)據(jù)結(jié)構(gòu),就是索引。其實說穿了,索引問題就是一個查找問題。二、索引的原理當(dāng)我們的業(yè)務(wù)產(chǎn)生了大量的數(shù)據(jù)時,查找數(shù)據(jù)的效率問題也就隨之而來,所以我們可以通過為表設(shè)置索引,而為表設(shè)置索引要付出代價的:一是增加了數(shù)據(jù)庫的存儲空間,二是在插入和修改數(shù)據(jù)時要花費較多的時間(因為索引也要隨之變動)。
上圖展示了一種可能的索引方式。左邊是數(shù)據(jù)表,一共有兩列七條記錄,最左邊的是數(shù)據(jù)記錄的物理地址(注意邏輯上相鄰的記錄在磁盤上也并不是一定物理相鄰的)。為了加快Col2的查找,可以維護(hù)一個右邊所示的二叉查找樹,每個節(jié)點分別包含索引鍵值和一個指向?qū)?yīng)數(shù)據(jù)記錄物理地址的指針,這樣就可以運用二叉查找在O(log2n)的復(fù)雜度內(nèi)獲取到相應(yīng)數(shù)據(jù)。索引是建立襪肢在數(shù)據(jù)庫表中的某些列的上面。在創(chuàng)建索引的時候,應(yīng)該考慮在哪些列上可以創(chuàng)建索引,在哪些列上不能創(chuàng)建索引。一般來說,應(yīng)該在這些列上創(chuàng)建索引:在經(jīng)常需要搜索的列上,可以加快搜索的速度;在作為主鍵的列上,強制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);在經(jīng)常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,因為索引已經(jīng)排序,其指定的范圍是連續(xù)的;在經(jīng)常需要排序的列上創(chuàng)建索引,因為索引已經(jīng)排序,這樣查詢可以利用索引的排序,加快排序查詢時間;在經(jīng)常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的判斷速度。創(chuàng)建索引可以大大提高系統(tǒng)的性能之一,通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。第二,可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。第三,可以加速表和表之間的連接,特別是在實現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。第四,在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時,同樣可以顯著減少查詢中分組和排序的時間。第五,通過使用晌裂索引,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。也許會有人要問:增加索引有如此多的優(yōu)點,為什么不對表中的每一個列創(chuàng)建一個索引呢?因為,增加索引也有許多不利的方面。創(chuàng)建索引的弊端之一,創(chuàng)建索引和維護(hù)索引要耗費時間,這種時間隨著數(shù)據(jù)量的增加而增加。第二,索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。第三,當(dāng)對表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時候,索引也要動態(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。同樣,對于有些列不應(yīng)告謹(jǐn)世該創(chuàng)建索引。一般來說,不應(yīng)該創(chuàng)建索引的的這些列具有下列特點:之一,對于那些在查詢中很少使用或者參考的列不應(yīng)該創(chuàng)建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,并不能提高查詢速度。相反,由于增加了索引,反而降低了系統(tǒng)的維護(hù)速度和增大了空間需求。第二,對于那些只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引。這是因為,由于這些列的取值很少,例如人事表的性別列,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,即需要在表中搜索的數(shù)據(jù)行的比例很大。增加索引,并不能明顯加快檢索速度。第三,對于那些定義為text, image和bit數(shù)據(jù)類型的列不應(yīng)該增加索引。這是因為,這些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少。第四,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時,不應(yīng)該創(chuàng)建索引。這是因為,修改性能和檢索性能是互相矛盾的。當(dāng)增加索引時,會提高檢索性能,但是會降低修改性能。當(dāng)減少索引時,會提高修改性能,降低檢索性能。因此,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時,不應(yīng)該創(chuàng)建索引。三、索引的類型根據(jù)數(shù)據(jù)庫的功能,可以在數(shù)據(jù)庫設(shè)計器中創(chuàng)建三種索引:唯一索引、主鍵索引和聚集索引。唯一索引唯一索引是不允許其中任何兩行具有相同索引值的索引。當(dāng)現(xiàn)有數(shù)據(jù)中存在重復(fù)的鍵值時,大多數(shù)數(shù)據(jù)庫不允許將新創(chuàng)建的唯一索引與表一起保存。數(shù)據(jù)庫還可能防止添加將在表中創(chuàng)建重復(fù)鍵值的新數(shù)據(jù)。例如,如果在employee表中職員的姓(lname)上創(chuàng)建了唯一索引,則任何兩個員工都不能同姓。主鍵索引數(shù)據(jù)庫表經(jīng)常有一列或列組合,其值唯一標(biāo)識表中的每一行。該列稱為表的主鍵。在數(shù)據(jù)庫關(guān)系圖中為表定義主鍵將自動創(chuàng)建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當(dāng)在查詢中使用主鍵索引時,它還允許對數(shù)據(jù)的快速訪問。聚集索引在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數(shù)據(jù)訪問速度。四、局部性原理與磁盤預(yù)讀由于存儲介質(zhì)的特性,磁盤本身存取就比主存慢很多,再加上機械運動耗費,磁盤的存取速度往往是主存的幾百分分之一,因此為了提高效率,要盡量減少磁盤I/O。為了達(dá)到這個目的,磁盤往往不是嚴(yán)格按需讀取,而是每次都會預(yù)讀,即使只需要一個字節(jié),磁盤也會從這個位置開始,順序向后讀取一定長度的數(shù)據(jù)放入內(nèi)存。這樣做的理論依據(jù)是計算機科學(xué)中著名的局部性原理:當(dāng)一個數(shù)據(jù)被用到時,其附近的數(shù)據(jù)也通常會馬上被使用。程序運行期間所需要的數(shù)據(jù)通常比較集中。由于磁盤順序讀取的效率很高(不需要尋道時間,只需很少的旋轉(zhuǎn)時間),因此對于具有局部性的程序來說,預(yù)讀可以提高I/O效率。預(yù)讀的長度一般為頁(page)的整倍數(shù)。頁是計算機管理存儲器的邏輯塊,硬件及操作系統(tǒng)往往將主存和磁盤存儲區(qū)分割為連續(xù)的大小相等的塊,每個存儲塊稱為一頁(在許多操作系統(tǒng)中,頁得大小通常為4k),主存和磁盤以頁為單位交換數(shù)據(jù)。當(dāng)程序要讀取的數(shù)據(jù)不在主存中時,會觸發(fā)一個缺頁異常,此時系統(tǒng)會向磁盤發(fā)出讀盤信號,磁盤會找到數(shù)據(jù)的起始位置并向后連續(xù)讀取一頁或幾頁載入內(nèi)存中,然后異常返回,程序繼續(xù)運行。五、B樹和B+樹數(shù)據(jù)結(jié)構(gòu)1、B樹B樹中每個節(jié)點包含了鍵值和鍵值對于的數(shù)據(jù)對象存放地址指針,所以成功搜索一個對象可以不用到達(dá)樹的葉節(jié)點。成功搜索包括節(jié)點內(nèi)搜索和沿某一路徑的搜索,成功搜索時間取決于關(guān)鍵碼所在的層次以及節(jié)點內(nèi)關(guān)鍵碼的數(shù)量。在B樹中查找給定關(guān)鍵字的方法是:首先把根結(jié)點取來,在根結(jié)點所包含的關(guān)鍵字K1,…,kj查找給定的關(guān)鍵字(可用順序查找或二分查找法),若找到等于給定值的關(guān)鍵字,則查找成功;否則,一定可以確定要查的關(guān)鍵字在某個Ki或Ki+1之間,于是取Pi所指的下一層索引節(jié)點塊繼續(xù)查找,直到找到,或指針Pi為空時查找失敗。2、B+樹B+樹非葉節(jié)點中存放的關(guān)鍵碼并不指示數(shù)據(jù)對象的地址指針,非也節(jié)點只是索引部分。所有的葉節(jié)點在同一層上,包含了全部關(guān)鍵碼和相應(yīng)數(shù)據(jù)對象的存放地址指針,且葉節(jié)點按關(guān)鍵碼從小到大順序鏈接。如果實際數(shù)據(jù)對象按加入的順序存儲而不是按關(guān)鍵碼次數(shù)存儲的話,葉節(jié)點的索引必須是稠密索引,若實際數(shù)據(jù)存儲按關(guān)鍵碼次序存放的話,葉節(jié)點索引時稀疏索引。B+樹有2個頭指針,一個是樹的根節(jié)點,一個是最小關(guān)鍵碼的葉節(jié)點。所以 B+樹有兩種搜索方法:一種是按葉節(jié)點自己拉起的鏈表順序搜索。一種是從根節(jié)點開始搜索,和B樹類似,不過如果非葉節(jié)點的關(guān)鍵碼等于給定值,搜索并不停止,而是繼續(xù)沿右指針,一直查到葉節(jié)點上的關(guān)鍵碼。所以無論搜索是否成功,都將走完樹的所有層。B+ 樹中,數(shù)據(jù)對象的插入和刪除僅在葉節(jié)點上進(jìn)行。這兩種處理索引的數(shù)據(jù)結(jié)構(gòu)的不同之處:1、B樹中同一鍵值不會出現(xiàn)多次,并且它有可能出現(xiàn)在葉結(jié)點,也有可能出現(xiàn)在非葉結(jié)點中。而B+樹的鍵一定會出現(xiàn)在葉結(jié)點中,并且有可能在非葉結(jié)點中也有可能重復(fù)出現(xiàn),以維持B+樹的平衡。2、因為B樹鍵位置不定,且在整個樹結(jié)構(gòu)中只出現(xiàn)一次,雖然可以節(jié)省存儲空間,但使得在插入、刪除操作復(fù)雜度明顯增加。B+樹相比來說是一種較好的折中。3、B樹的查詢效率與鍵在樹中的位置有關(guān),更大時間復(fù)雜度與B+樹相同(在葉結(jié)點的時候),最小時間復(fù)雜度為1(在根結(jié)點的時候)。而B+樹的時候復(fù)雜度對某建成的樹是固定的。六、B/+Tree索引的性能分析到這里終于可以分析B-/+Tree索引的性能了。上文說過一般使用磁盤I/O次數(shù)評價索引結(jié)構(gòu)的優(yōu)劣。先從B-Tree分析,根據(jù)B-Tree的定義,可知檢索一次最多需要訪問h個節(jié)點。數(shù)據(jù)庫系統(tǒng)的設(shè)計者巧妙利用了磁盤預(yù)讀原理,將一個節(jié)點的大小設(shè)為等于一個頁,這樣每個節(jié)點只需要一次I/O就可以完全載入。為了達(dá)到這個目的,在實際實現(xiàn)B-Tree還需要使用如下技巧:每次新建節(jié)點時,直接申請一個頁的空間,這樣就保證一個節(jié)點物理上也存儲在一個頁里,加之計算機存儲分配都是按頁對齊的,就實現(xiàn)了一個node只需一次I/O。B-Tree中一次檢索最多需要h-1次I/O(根節(jié)點常駐內(nèi)存),漸進(jìn)復(fù)雜度為O(h)=O(logdN)。一般實際應(yīng)用中,出度d是非常大的數(shù)字,通常超過100,因此h非常小(通常不超過3)。而紅黑樹這種結(jié)構(gòu),h明顯要深的多。由于邏輯上很近的節(jié)點(父子)物理上可能很遠(yuǎn),無法利用局部性,所以紅黑樹的I/O漸進(jìn)復(fù)雜度也為O(h),效率明顯比B-Tree差很多。綜上所述,用B-Tree作為索引結(jié)構(gòu)效率是非常高的。
外鍵數(shù)據(jù)庫怎么創(chuàng)建索引的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于外鍵數(shù)據(jù)庫怎么創(chuàng)建索引,外鍵數(shù)據(jù)庫索引創(chuàng)建方法詳解,數(shù)據(jù)庫索引的實現(xiàn)原理的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
文章名稱:外鍵數(shù)據(jù)庫索引創(chuàng)建方法詳解(外鍵數(shù)據(jù)庫怎么創(chuàng)建索引)
文章分享:http://fisionsoft.com.cn/article/cddepoo.html


咨詢
建站咨詢
