A. 聚集索引和唯一索引的區別是什麼
聚集索引並不一定是唯一索引。
主鍵是唯一的,所以創建了一個主鍵的同時,也就這個欄位創建了一個唯一的索引, 唯一索引實際上就是要求指定的列中所有的數據必須不同。主鍵一唯一索引的區別:
1 一個表的主鍵只能有一個,而唯一索引可以建多個。
2 主鍵可以作為其它表的外鍵。
3 主鍵不可為null,唯一索引可以為null。
1、聚集索引
(1)首先指出一個誤區,主鍵並不一定是聚集索引,只是在sql SERVER中,未明確指出的情況下,默認將主鍵定義為聚集,而ORACLE中則默認是非聚集,因為SQL SERVER中的ROWID未開放使用。
(2)聚集索引適合用於需要進行范圍查找的列,因為聚集索引的葉子節點存放的是有序的數據行,查詢引擎可根據WHERE中給出的范圍,直接定位到兩端的葉子節點,將這部分節點頁的數據根據鏈表順序取出即可;
(3)聚集索引盡量建立在值不會發生變更的列上,否則會帶來非聚集索引的維護;
(4)盡量在建立非聚集索引之前建立聚集索引,否則會導致表上所有非聚集索引的重建;
(5)聚集索引應該避免建立在數值單調的列上,否則可能會造成IO的競爭,以及B樹的不平衡,從而導致資料庫系統頻繁的維護B樹的平衡性。聚集索引的列值最好能夠在表中均勻分布。
2、唯一索引
(1)再指出一個誤區,聚集索引並不一定是唯一索引,由於SQL SERVER將主鍵默認定義為聚集索引,事實上,索引是否唯一與是否聚集是不相關的,聚集索引可以是唯一索引,也可以是非唯一索引;
(2)將索引設置為唯一,對於等值查找是很有利的,當查到第一條符合條件的紀錄時即可停止查找,返回數據,而非唯一索引則要繼續查找,同樣,由於需要保證唯一性,每一行數據的插入都會去檢查重復性;
B. 索引是不是分為唯一索引和非唯一索引
根據資料庫的功能,可以在資料庫設計器中創建四種索引:單列索引、唯一索引、主鍵索引和聚集索引。
1,普通索引
最基本的索引類型,沒有唯一性之類的限制。
2,唯一索引
唯一索引是不允許其中任何兩行具有相同索引值的索引。
當現有數據中存在重復的鍵值時,大多數資料庫不允許將新創建的唯一索引與表一起保存。資料庫還可能防止添加將在表中創建重復鍵值的新數據。例如,如果在 employee 表中職員的姓 (lname) 上創建了唯一索引,則任何兩個員工都不能同姓。
對某個列建立UNIQUE索引後,插入新記錄時,資料庫管理系統會自動檢查新紀錄在該列上是否取了重復值,在CREATE TABLE 命令中的UNIQE約束將隱式創建UNIQUE索引。
3,主鍵索引
簡稱為主索引,資料庫表中一列或列組合(欄位)的值唯一標識表中的每一行。該列稱為表的主鍵。
在資料庫關系圖中為表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問。
提示盡管唯一索引有助於定位信息,但為獲得最佳性能結果,建議改用主鍵索引。
4,候選索引
與主索引一樣要求欄位值的唯一性,並決定了處理記錄的順序。在資料庫和自由表中,可以為每個表建立多個候選索引。
5,聚集索引
也稱為聚簇索引,在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引, 即如果存在聚集索引,就不能再指定CLUSTERED 關鍵字。
6,非聚集索引
也叫非簇索引,在非聚集索引中,資料庫表中記錄的物理順序與索引順序可以不相同。一個表中只能有一個聚集索引,但表中的每一列都可以有自己的非聚集索引。如果在表中創建了主鍵約束,SQL Server將自動為其產生唯一性約束。在創建主鍵約束時,如果制定CLUSTERED關鍵字,則將為表產生唯一聚集索引。
(2)sql索引和非唯一的區別擴展閱讀:
並非所有的資料庫都以相同的方式使用索引。作為通用規則,只有當經常查詢索引列中的數據時,才需要在表上創建索引。索引佔用磁碟空間,並且降低添加、刪除和更新行的速度。如果應用程序非常頻繁地更新數據或磁碟空間有限,則可能需要限制索引的數量。在表較大時再建立索引,表中的數據越多,索引的優越性越明顯。
可以基於資料庫表中的單列或多列創建索引。多列索引使您可以區分其中一列可能有相同值的行。
參考資料來源:網路-索引
C. mysql 「索引」能重復嗎「唯一索引」與「索引」區別是什麼
一、使用不同:
主鍵索引是在創建主鍵時一起創建的,是基於主鍵約束而建立的,是不可以為空,也不可以重復。
唯一索是引基於唯一約束而建立的,可以為空不可以重復,主鍵索引本身就具備了唯一索引的功能。
二、作用不同:
唯一索引的作用跟主鍵的作用一樣。不同的是,在一張表裡面只能有一個主鍵,主鍵不能為空,唯一索引可以有多個,唯一索引可以有一條記錄為空,即保證跟別人不一樣就行。
比如學生表,在學校裡面一般用學號做主鍵,身份證則弄成唯一索引;而到了教育局,他們就把身份證號弄成主鍵,學號換成了唯一索引。
三、定義不同:
普通索引:這是最基本的索引類型,而且它沒有唯一性之類的限制。
唯一性索引:這種索引和前面的「普通索引」基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。
(3)sql索引和非唯一的區別擴展閱讀:
要對一個表建立唯一索引,可以使用關鍵字UNIQUE。對聚簇索引和非聚簇索引都可以使用這個關鍵字。
例子
CREATE UNIQUE CLUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
其中:CLUSTERED INDEX是用來建立聚簇索引的關鍵字,此語句的意思是在表mytable上的mycolumn欄位上創建一個名為myclumn_cindex的聚簇索引,且為唯一索引。
D. SQL SERVER資料庫里的唯一索引UNIQUE和聚集索引、非聚集索引有什麼區別有什麼區別,
索引實際上是一組指向表中數據的指針,索引的排列順序其實就是這組指針的順序.
聚集索引:表的物理存儲順序與指針(即邏輯)順序相同
非聚集索引:物理與邏輯順序不同
因為一個表只能有一個物理順序,所以,聚集索引的個數最多隻能是1.
其中唯一索引是給所做的索引增加了唯一性的約束,添加,修改索引列中數據時,不允許出現重復值.它可以是聚集索引,也可以是非聚集的,就看你如何定義
主鍵索引是把主鍵列定義為索引,主鍵具有唯一性,所以主鍵索引是唯一索引的一種特殊形式
E. sql主鍵約束和唯一約束的區別
.主鍵約束(PRIMARY KEY)
1) 主鍵用於唯一地標識表中的每一條記錄,可以定義一列或多列為主鍵。
2) 是不可能(或很難)更新.
3) 主鍵列上沒有任何兩行具有相同值(即重復值),不允許空(NULL).
4) 主健可作外健,唯一索引不可;
2.唯一性約束(UNIQUE)
1) 唯一性約束用來限制不受主鍵約束的列上的數據的唯一性,用於作為訪問某行的可選手段,一個表上可以放置多個唯一性約束.
2) 只要唯一就可以更新.
3) 即表中任意兩行在 指定列上都不允許有相同的值,允許空(NULL).
4) 一個表上可以放置多個唯一性約束
3.唯一索引(INDEX)
創建唯一索引可以確保任何生成重復鍵值的嘗試都會失敗。
唯一性約束和主鍵約束的區別:
(1).唯一性約束允許在該列上存在NULL值,而主鍵約束的限制更為嚴格,不但不允許有重復,而且也不允許有空值。
(2).在創建唯一性約束和主鍵約束時可以創建聚集索引和非聚集索引,但在 默認情況下主鍵約束產生聚集索引,而唯一性約束產生非聚集索引
約束和索引, 前者是用來檢查數據的正確性,後者用來實現數據查詢的優化,目的不同。
唯一性約束與唯一索引有所不同:
(1).創建唯一約束會在Oracle中創建一個Constraint,同時也會創建一個該約束對應的唯一索引。
(2).創建唯一索引只會創建一個唯一索引,不會創建Constraint。
也就是說其實唯一約束是通過創建唯一索引來實現的。
在刪除時這兩者也有一定的區別:
刪除唯一約束時可以只刪除約束而不刪除對應的索引,所以對應的列還是必須唯一的,
而刪除了唯一索引的話就可以插入不唯一的值。
F. 在SQL中,唯一索引是什麼喲
這種索引和前面的「普通索引」基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。唯一性索引可以用以下幾種方式創建:
創建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
創建表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );
G. SQL聚集索引和非聚集索引的區別
資料庫的索引,聽起來挺神秘的,仔細想想。這些索引,其實就是平時咱們查東西時候常用的兩種手段。無非就是為了提高我們找東西的效率而已。那麼我們平時又是怎麼查東西呢?
聚集索引:
聚集索引,來源於生活嘗試。這中索引可以說是按照數據的物理存儲進行劃分的。對於一堆記錄來說,使用聚集索引就是對這堆記錄 進行 堆劃分。即主要描述的是物理上的存儲。
舉個例子:
比如圖書館新進了一批書。那麼這些書需要放到圖書館內。書如何放呢?一般都有一個規則,雜志類的放到101房間,文學類的放到102房間,理工類的放到103房間等等。這些存儲的規則決定了每本書應該放到哪裡。而這個例子中聚集索引為書的類別。
正式因為這種存儲規則,才導致 聚集索引的唯一性。
誤區:
有的人認為,聚集索引的欄位是唯一的。這是因為sql server 中添加主鍵的時候,自動給主鍵所在的欄位生成一個聚集索引。所以人們會認為聚集索引所加的欄位是唯一的。
思考一下上面這個問題。雜志類的書放到101房間。那麼如果雜志類的書太多,一個101房間存放不下。那麼可能101,201兩個房間來存放雜志類的書籍。如果這樣分析的話,那麼一個雜志類對應多個房間。放到表存儲的話,那麼這個類別欄位 就不是唯一的了。
非聚集索引:
非聚集索引,也可以從生活中找到映射。非聚集索引強調的是邏輯分類。可以說是定義了一套存儲規則,而需要有一塊控制項來維護這個規則,這個被稱之為索引表。
繼續使用上述提到的例子:
同學如果想去圖書館找一本書,而不知道這本書在哪裡?那麼這個同學首先應該找的就是 檢索室吧。對於要查找一本書來說,在檢索室查是一個非常快捷的的途徑了吧。但是,在檢索室中你查到了該書在XX室XX書架的信息。你的查詢結束了嗎?沒有吧。你僅僅找到了目的書的位置信息,你還要去該位置去取書。
對於這種方式來說,你需要兩個步驟:
1、查詢該記錄所在的位置。
2、通過該位置去取要找的記錄。
區別:
聚集索引:可以幫助把很大的范圍,迅速減小范圍。但是查找該記錄,就要從這個小范圍中Scan了。
非聚集索引:把一個很大的范圍,轉換成一個小的地圖。你需要在這個小地圖中找你要尋找的信息的位置。然後通過這個位置,再去找你所需要的記錄。
索引與主鍵的區別
主鍵:主鍵是唯一的,用於快速定位一條記錄。
聚集索引:聚集索引也是唯一的。(因為聚集索引的劃分依據是物理存儲)。而聚集索引的主要是為了快速的縮小查找范圍,即記錄數目未定。
主鍵和索引沒有關系。他們的用途相近。如果聚集索引加上唯一性約束之後,他們的作用就一樣了。
使用場景
基於上述的兩種規則,那麼在什麼時候適合聚集索引,什麼時候適合非聚集索引?
H. SQL Server唯一索引和非唯一索引的區別簡析
SQL Server創建索引時,可以指定Unique使之成為唯一索引。「唯一」顧名思義,但是兩都到底有什麼區別呢?因為索引也是一種物理結構,所以還是要從存儲和結構上分析。
索引結構分葉級和非葉級,分析時我們要分開來看,這個很重要。
文中涉及的索引行大小計算,參考MSDN估計資料庫大小索引部分。
1. 非唯一聚集索引和唯一聚集索引
創建兩個測試表,各10000條整數,tb1唯一,tb2非唯一,有1000條為9999的重復值。
view sourceprint?
01.<img onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_402704').style.display='none'; document.getElementById('Code_Open_Image_402704').style.display='inline'; document.getElementById('Code_Open_Text_402704').style.display='inline';"id="Code_Closed_Image_402704"align="top"src=""width="11"height="16"style="display: none;"><img alt="載入中..."title="圖片載入中..."src="http://www.it165.net/statics/images/s_nopic.gif"><img onclick="this.style.display='none'; document.getElementById('Code_Open_Text_402704').style.display='none'; getElementById('Code_Closed_Image_402704').style.display='inline'; getElementById('Code_Closed_Text_402704').style.display='inline';"id="Code_Open_Image_402704"style="display: none;"align="top"src=""width="11"height="16"><img alt="載入中..."title="圖片載入中..."src="http://www.it165.net/statics/images/s_nopic.gif">Codecreate table tb1
02.(col1int);
03.declare@iint=1
04.while@i<10001
05.begin
06.insert into tb1 values(@i);
07.set@i=@i+1;
08.end;
09.create unique clustered index ucix on tb1 (col1)
10.go
11.-------
12.create table tb2
13.(col2int);
14.declare@iint=1
15.while@i<9001
16.begin
17.insert into tb2 values(@i);
18.set@i=@i+1;
19.end;
20.go
21.insert into tb2 values(9999)
22.go1000;
23.create clustered index cix on tb2 (col2)
24.go
先查詢索引的一些基本狀況:
發現多出一個UNIQUIFIER,同樣葉級也是一樣。MSDN說明:
「如果聚集索引不是唯一的索引,SQL Server 將添加在內部生成的值(稱為唯一值)以使所有重復鍵唯一。此四位元組的值對於用戶不可見。僅當需要使聚集鍵唯一以用於非聚集索引中時,才添加該值。」
還有UNIQUIFIER不是一個全局自增列,重復記錄增加時此值會發生改變,並且它是一個可為null的變長列。
現在來算一算索引行大小:
兩個表都是只有一個int型可為NULL的欄位,而聚集索引葉級是存儲數據本身
葉級是一個4位元組的INT列,無變長列,加上3位元組的NULL點陣圖,再加上4位元組的行頭開銷:兩個表的葉級minSize =4+0+3+4=11
非葉級是一個4位元組的INT列,無變長列,加上3位元組的NULL點陣圖,加上1位元組的行頭開銷,再加6位元組的子頁指針:兩個表的非葉級minSize=4+0+3+1+6=14
tb1的索引行大小是一致的minSize=maxSize,因為它是唯一的。tb2的索引行大小不一致,有大有小,大的索引行是因為:a)不唯一 b)UNIQUIFIER
唯一標識列增加了2+1*2+4=8位元組開銷,tb2的min和max相差就是這8位元組。
tb2的葉級maxSize=4+8+3+4=19
tb2的非葉級maxSize=4+8+3+1+6=22
小結:非唯一聚集索引為保證索引鍵值唯一性,會生成UNIQUIFIER與鍵列一起組成索引鍵值。同時無論在葉級還是非葉頁級,都比唯一索引佔用更多存儲空間。
I. SQL SERVER中索引類型包括的三種類型分別是哪三種
三種索引類型分別是:
1、主鍵索引:不允許具有索引值相同的行,從而禁止重復的索引或鍵值。系統在創建該索引時檢查是否有重復的鍵值,並在每次使用 INSERT 或 UPDATE 語句添加數據時進行檢查。
2、聚集索引:指資料庫錶行中數據的物理順序與鍵值的邏輯(索引)順序相同。一個表只能有一個聚集索引,因為一個表的物理順序只有一種情況。
3、非聚集索引:索引中索引的邏輯順序與磁碟上行的物理存儲順序不同。非聚集索引的葉層不包含數據頁。 相反,葉節點包含索引行。
(9)sql索引和非唯一的區別擴展閱讀
聚集索引對於那些經常要搜索范圍值的列特別有效。使用聚集索引找到包含第一個值的行後,便可以確保包含後續索引值的行在物理相鄰。
例如,如果應用程序執行的一個查詢經常檢索某一日期范圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。
頻繁更改的列 這將導致整行移動,因為 SQL Server 必須按物理順序保留行中的數據值。這一點要特別注意,因為在大數據量事務處理系統中數據是易失的。來自聚集索引的鍵值由所有非聚集索引作為查找鍵使用,因此存儲在每個非聚集索引的葉條目內。
J. SQL聚集索引和非聚集索引的區別
1
聚集索引:該索引中鍵值的邏輯順序決定了表中相應行的物理順序。
聚集索引確定表中數據的物理順序。聚集索引類似於電話簿,後者按姓氏排列數據。由於聚集索引規定數據在表中的物理存儲順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。
2
聚集索引使用注意事項
定義聚集索引鍵時使用的列越少越好。
• 包含大量非重復值的列。
.• 使用下列運算符返回一個范圍值的查詢:BETWEEN、>、>=、< 和 <=。
• 被連續訪問的列。
• 回大型結果集的查詢。
• 經常被使用聯接或 GROUP BY 子句的查詢訪問的列;一般來說,這些是外鍵列。對 ORDER BY 或 GROUP BY 子句中指定的列進行索引,可以使 SQL Server 不必對數據進行排序,因為這些行已經排序。這樣可以提高查詢性能。
• OLTP 類型的應用程序,這些程序要求進行非常快速的單行查找(一般通過主鍵)。應在主鍵上創建聚集索引。
3
聚集索引不適用於:
• 頻繁更改的列 。這將導致整行移動(因為 SQL Server 必須按物理順序保留行中的數據值)。這一點要特別注意,因為在大數據量事務處理系統中數據是易失的。
• 寬鍵 。來自聚集索引的鍵值由所有非聚集索引作為查找鍵使用,因此存儲在每個非聚集索引的葉條目內。
4
非聚集索引:數據存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數據的存儲位置。
非聚集索引中的項目按索引鍵值的順序存儲,而表中的信息按另一種順序存儲(這可以由聚集索引規定)。對於非聚集索引,可以為在表非聚集索引中查找數據時常用的每個列創建一個非聚集索引。有些書籍包含多個索引。例如,一本介紹園藝的書可能會包含一個植物通俗名稱索引,和一個植物學名索引,因為這是讀者查找信息的兩種最常用的方法。
5
一個通俗的舉例,說明兩者的區別
其實,我們的漢語字典的正文本身就是一個聚集索引。比如,我們要查「安」字,就會很自然地翻開字典的前幾頁,因為「安」的拼音是「an」,而按照拼音排序漢字的字典是以英文字母「a」開頭並以「z」結尾的,那麼「安」字就自然地排在字典的前部。如果您翻完了所有以「a」開頭的部分仍然找不到這個字,那麼就說明您的字典中沒有這個字;同樣的,如果查「張」字,那您也會將您的字典翻到最後部分,因為「張」的拼音是「zhang」。也就是說,字典的正文部分本身就是一個目錄,您不需要再去查其他目錄來找到您需要找的內容。我們把這種正文內容本身就是一種按照一定規則排列的目錄稱為「聚集索引」。
如果您認識某個字,您可以快速地從自動中查到這個字。但您也可能會遇到您不認識的字,不知道它的發音,這時候,您就不能按照剛才的方法找到您要查的字,而需要去根據「偏旁部首」查到您要找的字,然後根據這個字後的頁碼直接翻到某頁來找到您要找的字。但您結合「部首目錄」和「檢字表」而查到的字的排序並不是真正的正文的排序方法,比如您查「張」字,我們可以看到在查部首之後的檢字表中「張」的頁碼是672頁,檢字表中「張」的上面是「馳」字,但頁碼卻是63頁,「張」的下面是「弩」字,頁面是390頁。很顯然,這些字並不是真正的分別位於「張」字的上下方,現在您看到的連續的「馳、張、弩」三字實際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結果,然後再翻到您所需要的頁碼。我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為「非聚集索引」。
6
下面這張圖總結了何時使用聚集索引或非聚集索引:
7
下面說說索引使用的幾個誤區和問題
第一:聚集索引的約束是唯一性,是否要求欄位也是唯一的呢?
分析:如果認為是的朋友,可能是受系統默認設置的影響,一般我們指定一個表的主鍵,如果這個表之前沒有聚集索引,同時建立主鍵時候沒有強制指定使用非聚集索引,SQL會默認在此欄位上創建一個聚集索引,而主鍵都是唯一的,所以理所當然的認為創建聚集索引的欄位也需要唯一。
結論:聚集索引可以創建在任何一列你想創建的欄位上,這是從理論上講,實際情況並不能隨便指定,否則在性能上會是惡夢。
第二:主鍵就是聚集索引
這樣有時會對聚集索引的一種浪費。雖然SQL SERVER默認是在主鍵上建立聚集索引的。但是由於聚集索引的優勢是很明顯的,而每個表中只能有一個聚集索引的規則,這使得聚集索引變得更加珍貴。
從我們前面談到的聚集索引的定義我們可以看出,使用聚集索引的最大好處就是能夠根據查詢要求,迅速縮小查詢范圍,避免全表掃描。在實際應用中,因為 ID號是自動生成的,我們並不知道每條記錄的ID號,所以我們很難在實踐中用ID號來進行查詢。這就使讓ID號這個主鍵作為聚集索引成為一種資源浪費。其次,讓每個ID號都不同的欄位作為聚集索引也不符合「大數目的不同值情況下不應建立聚合索引」規則;當然,這種情況只是針對用戶經常修改記錄內容,特別是索引項的時候會負作用,但對於查詢速度並沒有影響。
第三:是不是聚集索引就一定要比非聚集索引性能優呢?
如果想查詢學分在60-90之間的學生的學分以及姓名,在學分上創建聚集索引是否是最優的呢?
答:否。既然只輸出兩列,我們可以在學分以及學生姓名上創建聯合非聚集索引,此時的索引就形成了覆蓋索引,即索引所存儲的內容就是最終輸出的數據,這種索引在比以學分為聚集索引做查詢性能更好。
第四:在資料庫中通過什麼描述聚集索引與非聚集索引的?
索引是通過二叉樹的形式進行描述的,我們可以這樣區分聚集與非聚集索引的區別:聚集索引的葉節點就是最終的數據節點,而非聚集索引的葉節仍然是索引節點,但它有一個指向最終數據的指針。
第五:在主鍵是創建聚集索引的表在數據插入上為什麼比主鍵上創建非聚集索引錶速度要慢?
有了上面第四點的認識,我們分析這個問題就有把握了,在有主鍵的表中插入數據行,由於有主鍵唯一性的約束,所以需要保證插入的數據沒有重復。我們來比較下主鍵為聚集索引和非聚集索引的查找情況:聚集索引由於索引葉節點就是數據頁,所以如果想檢查主鍵的唯一性,需要遍歷所有數據節點才行,但非聚集索引不同,由於非聚集索引上已經包含了主鍵值,所以查找主鍵唯一性,只需要遍歷所有的索引頁就行,這比遍歷所有數據行減少了不少IO消耗。這就是為什麼主鍵上創建非聚集索引比主鍵上創建聚集索引在插入數據時要快的真正原因。