一.索引
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