1. 程式人生 > >SQL有三個類型的索引,唯一索引 不能有重復,但聚集索引,非聚集索引可以有重復

SQL有三個類型的索引,唯一索引 不能有重復,但聚集索引,非聚集索引可以有重復

返回 自動添加 post 設置 span 唯一索引 tca lock 所有

重要:

(1) SQL如果創建時候,不指定類型那麽默認是非聚集索引

(2) 聚集索引和非聚集索引都可以有重復記錄,唯一索引不能有重復記錄。

(3) 主鍵 默認是加了唯一約束的聚集索引,但是也可以在主鍵創建時,指定為唯一約束的非聚集索引,因此主鍵僅僅是默認加了唯一約束的聚集索引,不能說主鍵就是加了唯一約束的聚集索引

有點拗口,可以參考我的博客:主鍵就是聚集索引嗎?

為列創建索引實際上就是為列進行排序,以方便查詢.建立一個列的索引,就相當與建立一個列的排序。

主鍵是唯一的,所以創建了一個主鍵的同時,也就這個字段創建了一個唯一的索引,

唯一索引實際上就是要求指定的列中所有的數據必須不同。

主鍵一唯一索引的區別:

1 一個表的主鍵只能有一個,而唯一索引可以建多個。
2 主鍵可以作為其它表的外鍵。
3 主鍵不可為null,唯一索引可以為null。

聚集索引:將表內的數據按照一定的規則進行排列的目錄。正因為如此,一個表中的聚焦索引只有一個。對此我們要註意“主鍵就是聚焦索引”這是極端錯誤的,是對聚焦索引的一種浪費。(雖然SQLServer默認主鍵就是聚焦索引)使用聚焦索引的最大好處就是按照查詢要求,迅速縮小查詢範圍,避免進行全表掃描。其次讓每個數目都不相同的字段作為聚焦索引也不符合“大數目不同情況下不應建立聚集索引的原則”。

一、索引的作用

1、幫助檢索數據;

2、提高聯接效率;

3、節省ORDER BY、GROUP BY的時間;

4、保證數據唯一性(僅限於唯一索引)。

二、索引的設計

在確定要建立一個索引時,首先我們要確定它是聚集還是非聚集、單列還是多列、唯一還是非唯一、列是升序還是降序、它的存儲是如何的,比如:分區、填充因子等。下面逐條來看:

1、聚集索引

(1)首先指出一個誤區,主鍵並不一定是聚集索引,只是在SQL SERVER中,未明確指出的情況下,默認將主鍵定義為聚集,而Oracle中則默認是非聚集,因為SQL SERVER中的ROWID未開放使用。

(2)聚集索引適合用於需要進行範圍查找的列,因為聚集索引的葉子節點存放的是有序的數據行,查詢引擎可根據WHERE中給出的範圍,直接定位到兩端的葉子節點,將這部分節點頁的數據根據鏈表順序取出即可;

(3)聚集索引盡量建立在值不會發生變更的列上,否則會帶來非聚集索引的維護;

(4)盡量在建立非聚集索引之前建立聚集索引,否則會導致表上所有非聚集索引的重建;

(5)聚集索引應該避免建立在數值單調的列上,否則可能會造成IO的競爭,以及B樹的不平衡,從而導致數據庫系統頻繁的維護B樹的平衡性。聚集索引的列值最好能夠在表中均勻分布。

3、唯一索引

(1)再指出一個誤區,聚集索引並不一定是唯一索引,由於SQL SERVER將主鍵默認定義為聚集索引,事實上,索引是否唯一與是否聚集是不相關的,聚集索引可以是唯一索引,也可以是非唯一索引;

(2)將索引設置為唯一,對於等值查找是很有利的,當查到第一條符合條件的紀錄時即可停止查找,返回數據,而非唯一索引則要繼續查找,同樣,由於需要保證唯一性,每一行數據的插入都會去檢查重復性;

下面是一個簡單的比較表

主鍵 聚集索引
用途 強制表的實體完整性 對數據行的排序,方便查詢用
一個表多少個 一個表最多一個主鍵 一個表最多一個聚集索引
是否允許多個字段來定義 一個主鍵可以多個字段來定義 一個索引可以多個字段來定義
是否允許 null 數據行出現 如果要創建的數據列中數據存在null,無法建立主鍵。
創建表時指定的 PRIMARY KEY 約束列隱式轉換為 NOT NULL。
沒有限制建立聚集索引的列一定必須 not null .
也就是可以列的數據是 null
參看最後一項比較
是否要求數據必須唯一 要求數據必須唯一 數據即可以唯一,也可以不唯一。看你定義這個索引的 UNIQUE 設置。
(這一點需要看後面的一個比較,雖然你的數據列可能不唯一,但是系統會替你產生一個你看不到的唯一列)
創建的邏輯 數據庫在創建主鍵同時,會自動建立一個唯一索引。
如果這個表之前沒有聚集索引,同時建立主鍵時候沒有強制指定使用非聚集索引,則建立主鍵時候,同時建立一個唯一的聚集索引
如果未使用 UNIQUE 屬性創建聚集索引,數據庫引擎 將向表自動添加一個四字節 uniqueifier 列。
必要時,數據庫引擎 將向行自動添加一個 uniqueifier 值,使每個鍵唯一。此列和列值供內部使用,用戶不能查看或訪問。
參考:主鍵,唯一索引 聚集索引的關系

SQL有三個類型的索引,唯一索引 不能有重復,但聚集索引,非聚集索引可以有重復