外來鍵該不該有索引

2021-08-18 20:42:28 字數 1014 閱讀 8330

參考:

在資料庫中,索引的使用非常重要,恰當的使用索引可以提高資料庫訪問的效率,但是索引的不當使用則會影響效能並占用不必要的儲存空間。

在oracle資料庫中,是否應該對外鍵使用索引呢?這可能是很多人都有的疑問,答案是肯定的,即在一般情況下應該對外鍵使用索引。

不過在弄清這個問題之前首先要明確乙個概念,就是「外來鍵」的定義。什麼是外來鍵呢?通過下面的解釋相信你一定能夠弄明白了。

1)候選鍵: 關係中的乙個屬性組,其值能唯一標識乙個元組,若從該屬性組中去掉任何乙個屬性,它就不具有這一性質了,這樣的屬性組稱作候選碼。

2)主鍵:當有多個候選碼時,可以選定乙個作為主碼,選定的候選碼稱主鍵

3)外來鍵: 關係r中的乙個屬性組,它不是r的候選碼,但它與另乙個關係s的候選碼相對應,則稱這個屬性組為r的外碼或外來鍵。

舉個例子:

有兩個關係:

student(s#,sname,d#),即學生這個關係有三個屬性:學號,姓名,所在系別

dep(d#,dname),即院系有兩個屬性:系號、系名

則s#、d#是主鍵,也是各自所在關係的唯一候選鍵,d#是student的外來鍵。

參考資料:資料庫——原理、程式設計與效能

在oracle資料庫中,當對父表(上面例子中的dep表)進行更新的時候,如果在子表(上面例子中的student表)中的外來鍵沒有使用索引,則在更新的過程中整個子表將被鎖定,而往往實際上並不需要鎖定整個子表,而僅僅需要鎖定子表中的幾條記錄。這樣就會大大影響資料庫訪問的併發性,甚至有可能造成死鎖的情況。

除了鎖表的問題之外,乙個沒有使用索引的外來鍵在下面兩種情況下表現的也十分糟糕:

這下你一定明白了為什麼需要在外鍵上使用索引的重要意義了,不過你還是堅持不想使用索引的話,也可以,不過必須保證下面三種情況同時滿足:

不從父表中刪除記錄

不更新父表中的主鍵的值

一般不進行父表和子表的連線查詢

如果你覺得你可以滿足上面的全部三個條件,那麼你可以不必為外來鍵新增索引。不過一般來講,上面的三種情況很難滿足,而如果你沒有使用索引的話,那麼你將為此付出很大的代價的!

窮男生該不該有愛情

艾馨 我是乙個窮男生,我沒有愛情,所以在論壇裡看到這個真實的帖子時,我哭了。我為窮男生的愛情感到悲哀,為生活的現實感到沮喪。我把這個故事轉給你,希望您能回答我,窮男生到底該不該有愛情?跟很多普通的故事一樣,我是個特困生,是村子裡唯一的大學生,學校其實很一般,不過是本科,而且我的高考成績是全縣第一。爺...

資料庫該不該用外來鍵

外來鍵這個東西讓多少程式設計師又愛又恨,雖然高效的保證了資料庫的完整性,一度讓我們覺得有了它,維護資料庫是多麼幸福的一件事情,我們不需要寫那麼多繁瑣的 來保證資料的完整性。可是隨著我們的系統逐漸龐大,我們又發現它給我們帶來了不少麻煩,複雜度 效能都受到了影響,於是我們就產生了到底該不該用外來鍵的疑問...

資料庫該不該使用外來鍵

以前的意識裡都是需要建立外來鍵,外來鍵能起到約束作用,能保證資料的完整性和一直性,比如如果沒有外來鍵約束,你自己程式控制又不到位把基本資訊都刪除了,詳情卻存在,人的基本資訊不存在了,工資資訊裡卻存在這個人,想要找這個人究竟是誰都找不到。今天看到原來的外來鍵都被去掉了,問了下組長,結果回答就兩個字 效...