資料庫中的索引、鍵和約束,資料庫索引約束

來源:互聯網
上載者:User

資料庫中的索引、鍵和約束,資料庫索引約束

一.索引
1.什麼是索引?
索引是對資料庫表中一列或多列的值進行排序的一種結構。
在關係型資料庫中,索引是一種與表有關的資料庫結構,是事實存在的。它可以使對於表的select等等操作更加快速,相當於一本書的目錄。
對於一張表,如果我們想要找到某一列符合特定值的記錄,第一種方法是全表搜尋,匹配,然後把所有符合的記錄列出,但是這樣做會消耗大量資料庫系統時間,並造成大量磁碟I/O操作;第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過儲存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。
索引是一個單獨的、物理的資料庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。由此可知,索引是要消耗資料庫空間的。
並非所有的資料庫都以相同的方式使用索引。作為通用規則,只有當經常查詢索引列中的資料時,才需要在表上建立索引。索引佔用磁碟空間,並且降低添加、刪除和更新行的速度。在多數情況下,索引用於資料檢索的速度優勢大大超過它的不足之處。但是,如果應用程式非常頻繁地更新資料或磁碟空間有限,則可能需要限制索引的數量。
可以使用單列作為索引,也可以使用多列聯合作為索引。
2.索引的優缺點
優點:
(1)大大加快資料的檢索速度;   
(2)建立唯一性索引,保證資料庫表中每一行資料的唯一性;   
(3)加速表和表之間的串連;   
(4)在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。
缺點:
(1)索引需要佔物理空間。   
(2)當對錶中的資料進行增加、刪除和修改的時候,索引也要動態維護,降低了資料的維護速度。
建立索引時的注意事項:
(1)考慮已在表上建立的索引數量。最好避免在單個表上有很多索引
(2)檢查已在表上建立的索引的定義。最好避免包含共用列的重疊索引
(3)檢查某列中唯一資料值的數量,並將該數量與表中的行數進行比較。比如如果有1000w記錄,某欄位為性別,只有男,女。也就是說一半的記錄都是重複的,這樣就要考慮是否還有必要建立索引了。

3.一些索引類別
(1)普通索引
也即不加任何限制的索引。
(2)唯一索引
一種索引,不允許具有索引值相同的行,從而禁止重複的索引或索引值。系統在建立該索引時檢查是否有重複的索引值,並在每次使用 INSERT 或 UPDATE 語句添加資料時進行檢查。
(3)主鍵索引
資料庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。它和唯一索引的共性在雩都不允許有重複記錄,區別在於,唯一索引是不限制null的,也就是說或可以有一條以上的null值插入,但是主鍵卻限定不可為空。
(4)聚簇索引和非聚簇索引
聚簇索引也叫簇類索引,是一種對磁碟上實際資料重新組織以按指定的一個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引尋找資料幾乎總是比使用非聚簇索引快。每張表只能建一個聚簇索引,並且建聚簇索引需要至少相當該表120%的附加空間,以存放該表的副本和索引中間頁。
聚簇是根據碼值找到資料的實體儲存體位置,從而達到快速檢索資料的目的。Oracle聚簇索引的順序就是資料的實體儲存體順序,分葉節點就是資料節點。非聚簇索引的順序與資料物理排列順序無關,分葉節點仍然是索引節點,只不過有一個指標指向對應的資料區塊。由於聚簇索引要按照索引排序,所以一個表最多隻能有一個聚簇索引,但可以使用多列。
ORACLE中的聚簇表是指兩個表有一個欄位完全相同,並且在業務中經常會按這個欄位為目標串連這兩個表,這時建立聚簇表,
兩個表公用一個欄位,能減少佔用空間,並能明顯提高串連查詢速度。
這兩篇都有實際的例子,這裡就不再深入討論了。
建立聚簇索引的思想
1、大多數表都應該有聚簇索引或使用分區來降低對錶尾頁的競爭,在一個高事務的環境中,對最後一頁的封鎖嚴重影響系統的輸送量。   
2、在聚簇索引下,資料在物理上按順序排在資料頁上,重複值也排在一起,因而在那些包含範圍檢查(between、<、<=、<>、>=)或使用group by或orderby的查詢時,一旦找到具有範圍中第一個索引值的行,具有後續索引值的行保證物理上毗連在一起而不必進一步搜尋,避免了大範圍掃描,可以大大提高查詢速度。   
3、在一個頻繁發生插入操作的表上建立聚簇索引時,不要建在具有單調上升值的列(如IDENTITY)上,否則會經常引起封鎖衝突。   
4、在聚簇索引中不要包含經常修改的列,因為碼值修改後,資料行必須移動到新的位置。   
5、選擇聚簇索引應基於where子句和串連操作的類型。
具體的聚簇索引請參考以下文章:
http://blog.sina.com.cn/s/blog_607b68cc0100f5jo.html
http://space.itpub.net/9778796/viewspace-660186

二.鍵
1.什麼叫鍵
資料庫中的鍵(key)又稱為關鍵字,是關聯式模式中的一個重要概念,它是邏輯結構,不是資料庫的物理部分。
2.唯一鍵
唯一鍵,即一個或者一組列,其中沒有重複的記錄。可以唯一標示一條記錄。
3.主鍵
屬於唯一鍵,是一個比較特殊的唯一鍵。區別在於主鍵不可為空白。
4.外鍵
如果公用關鍵字在一個關係中是主關鍵字,那麼這個公用關鍵字被稱為另一個關係的外鍵。由此可見,外鍵表示了兩個關係之間的聯絡。以另一個關係的外鍵作主關鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表。外鍵又稱作外關鍵字。換而言之,如果關係模式R中的某屬性集不是R的主鍵,而是另一個關係R1的主鍵則該屬性集是關係模式R的外鍵,通常在資料庫設計中縮寫為FK。
外鍵在開發中基本使用不到,主要是資料庫用來保證資料的完整性的
舉個簡單的例子
表A內有列C1
表B內有列C2
將C2的外鍵指向C1
那麼當你向表B插入資料時,C2的內容必須為C1中的一個
還有幾個約束需要你設定
如刪除或者修改表A中的欄位時怎麼處理表B中相關聯的資料
5.父鍵
對於有外鍵關係的2張表,存在外鍵的表所參照的表叫主表,而存在外鍵的表叫從表。

三.約束
像主鍵、唯一等等其實都是一種約束。
其中主鍵約束比唯一約束更嚴格,不可為空。
四.鍵、索引、約束的區別
一般,我們看到術語“索引”和“鍵”交換使用,但實際上這兩個是不同的。索引是儲存在資料庫中的一個物理結構,鍵純粹是一個邏輯概念。鍵代表建立來實施商務規則的完整性條件約束。索引和鍵的混淆通常是由於資料庫使用索引來實施完整性條件約束。
(1)主鍵索引和主鍵有什麼關係?
主鍵索引是建立主鍵的時候系統自動建立的索引,主鍵要求不重複,不為空白,但是他如何判斷有效率呢?當然是建索引了,老是全表遍曆還不瘋掉。
所以建立主鍵會自動的建立主鍵索引。
(2)主鍵和唯一鍵的區別在於唯一鍵可以為空白,主鍵不可以
(3)建立唯一約束和唯一索引又什麼區別?
同理,建立唯一約束的時候,也會自動的建立唯一索引。建立唯一索引可以說是唯一約束的一種手段。
基本上,實現起來是沒有什麼區別的。如果實在理解不了,就當一樣好了。
(4)聚簇索引和非聚簇索引有何區別?
這個上邊已經講和很詳細了,還附有兩篇文章,這裡就不說了。
(5) 約束和主鍵有什麼區別?
約束一般有主鍵約束,外鍵約束,唯一約束等。
分別為primary key,foreign key,unique 其中主鍵約束只是約束的一種。
其實他們是不同概念的東西。

轉載地址:http://blog.csdn.net/dlodj/article/details/7017331

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.