A. 按照存儲結構劃分,索引分為哪兩類各有何作用
聚集索引:對表在物理數據頁中的數據排列進行排序,然後重新存儲到磁碟上,表中的數據行只能以一種方式存儲在磁碟上,故一個表只能有一個聚集索引。創建任何非聚集索引之前必須創建聚集索引。
非聚集索引:具有完全獨立於數據行的結構,使用非聚集索引不會影響數據表中記錄的實際存儲順序。
(1)聚簇索引有沒有存儲實際數據擴展閱讀
優點
1.大大加快數據的檢索速度;
2.創建唯一性索引,保證資料庫表中每一行數據的唯一性;
3.加速表和表之間的連接;
4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。
缺點
1.索引需要佔物理空間。
2.當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度。
B. 聚集索引和非聚集索引的區別有哪些
1、含義上的區別
聚集索引是指資料庫錶行中數據的物理順序與鍵值的邏輯(索引)順序相同。一個表只能有一個聚集索引,因為一個表的物理順序只有一種情況,所以,對應的聚集索引只能有一個。
非聚集索引是一種索引,該索引中索引的邏輯順序與磁碟上行的物理存儲順序不同。
2、從行定位器的性質上來區別
非聚集索引可以在有聚集索引的表、堆集或索引視圖上定義。如果表有聚集索引,或者索引在索引視圖上,則行定位器就是行的聚集索引鍵。
如果表是堆集,即非聚集索引,行定位器就是指向行的指針。該指針用文件標識符 (ID)、頁碼和頁上的行數生成。
3、應用上的區別
聚集索引適合應用於含有大量非重復值的列;使用BETWEEN,>,>=,<或<=返回一個范圍值的列;被連續訪問的列;返回大型結果集的查詢;經常被使用連接或GROUP BY子句的查詢訪問的列。
非聚集索引適用於經常被分組排序的列;大數目的不同值;頻繁更新的列;外鍵列;主鍵列;頻繁修改索引列。
C. 什麼是聚集索引和非聚集索引
聚集索引:也稱 Clustered Index。是指關系表記錄的物理順序與索引的邏輯順序相同。由於一張表只能按照一種物理順序存放,一張表最多也只能存在一個聚集索引。與非聚集索引相比,聚集索引有著更快的檢索速度。
MySQL 里只有 INNODB 表支持聚集索引,INNODB 表數據本身就是聚集索引,也就是常說 IOT,索引組織表。非葉子節點按照主鍵順序存放,葉子節點存放主鍵以及對應的行記錄。所以對 INNODB 表進行全表順序掃描會非常快。
非聚集索引:也叫 Secondary Index。指的是非葉子節點按照索引的鍵值順序存放,葉子節點存放索引鍵值以及對應的主鍵鍵值。MySQL 里除了 INNODB 表主鍵外,其他的都是二級索引。MYISAM,memory 等引擎的表索引都是非聚集索引。簡單點說,就是索引與行數據分開存儲。一張表可以有多個二級索引。
關鍵詞:愛可生、開源資料庫、數據監測、資料庫運維
D. 資料庫索引的主要種類
資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。索引分為聚簇索引和非聚簇索引兩種,聚簇索引
是按照數據存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快。
根據資料庫的功能,可以在資料庫設計器中創建三種索引:唯一索引、主鍵索引和聚集索引。有關資料庫所支持的索引功能的詳細信息,請參見資料庫文檔。
提示:盡管唯一索引有助於定位信息,但為獲得最佳性能結果,建議改用主鍵或唯一約束。
唯一索引
唯一索引是不允許其中任何兩行具有相同索引值的索引。
當現有數據中存在重復的鍵值時,大多數資料庫不允許將新創建的唯一索引與表一起保存。資料庫還可能防止添加將在表中創建重復鍵值的新數據。例如,如果在employee表中職員的姓(lname)上創建了唯一索引,則任何兩個員工都不能同姓。
主鍵索引
資料庫表經常有一列或多列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。
在資料庫關系圖中為表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問。
聚集索引
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。
如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數據訪問速度。
索引列
可以基於資料庫表中的單列或多列創建索引。多列索引可以區分其中一列可能有相同值的行。
如果經常同時搜索兩列或多列或按兩列或多列排序時,索引也很有幫助。例如,如果經常在同一查詢中為姓和名兩列設置判據,那麼在這兩列上創建多列索引將很有意義。
確定索引的有效性:
檢查查詢的WHERE和JOIN子句。在任一子句中包括的每一列都是索引可以選擇的對象。
對新索引進行試驗以檢查它對運行查詢性能的影響。
考慮已在表上創建的索引數量。最好避免在單個表上有很多索引。
檢查已在表上創建的索引的定義。最好避免包含共享列的重疊索引。
檢查某列中唯一數據值的數量,並將該數量與表中的行數進行比較。比較的結果就是該列的可選擇性,這有助於確定該列是否適合建立索引,如果適合,確定索引的類型。
E. 怎麼理解聚集索引和非聚集索引
聚簇索引即建立在聚簇上的索引,創建聚簇索引時,需要對已有表數據重新進行排序(若表中已有數據),即刪除原始的表數據後再將排序結果按物理順序插回,故聚簇索引建立完畢後,建立聚簇索引的列中的數據已經全部按序排列。一個表中只能包含一個聚簇索引,但該索引可以包含多個列。B-樹索引中,聚簇索引的葉層就是數據頁。非聚簇索引類似書本索引,索引與數據存放在不同的物理區域,建立非聚簇索引時數據本身不進行排序。一個表中科含多個非聚簇索引。B-樹索引中,非聚簇索引的葉層仍是索引頁,其以指針指向數據頁實際存儲位置。
F. 聚簇索引和非聚簇索引的區別是什麼
存儲特點的區別:
聚集索引。表數據按照索引的順序來存儲的,也就是說索引項的順序與表中記錄的物理順序一致。對於聚集索引,葉子結點即存儲了真實的數據行,不再有另外單獨的數據頁。 在一張表上最多隻能創建一個聚集索引,因為真實數據的物理順序只能有一種。
非聚集索引。表數據存儲順序與索引順序無關。對於非聚集索引,葉結點包含索引欄位值及指向數據頁數據行的邏輯指針,其行數量與數據錶行數據量一致。
總結一下:聚集索引是一種稀疏索引,數據頁上一級的索引頁存儲的是頁指針,而不是行指針。而對於非聚集索引,則是密集索引,在數據頁的上一級索引頁它為每一個數據行存儲一條索引記錄。
更新表數據
1、向表中插入新數據行
如果一張表沒有聚集索引,那麼它被稱為 「堆集」(Heap)。這樣的表中的數據行沒有特定的順序,所有的新行將被添加到表的末尾位置。
而建立了聚簇索引的數據表則不同:最簡單的情況下,插入操作根據索引找到對應的數據頁,然後通過挪動已有的記錄為新數據騰出空間,最後插入數據。如果數據頁已滿,則需要拆分數據頁,調整索引指針(且如果表還有非聚集索引,還需要更新這些索引指向新的數據頁)。而類似於自增列為聚集索引的,資料庫系統可能並不拆分數據頁,而只是簡單的新添數據頁。
2、從表中刪除數據行
對刪除數據行來說:刪除行將導致其下方的數據行向上移動以填充刪除記錄造成的空白。如果刪除的行是該數據頁中的最後一行,那麼該數據頁將被回收,相應的索引頁中的記錄將被刪除。對於數據的刪除操作,可能導致索引頁中僅有一條記錄,這時,該記錄可能會被移至鄰近的索引頁中,原索引頁將被回收,即所謂的「索引合並」。
G. SQL中的聚簇索引和非聚簇索引什麼意思
1、聚簇索引是一種對磁碟上實際數據重新組織以按指定的一個或多個列的值排序。由於聚簇索引的索引頁面指針指向數據頁面,所以使用聚簇索引查找數據幾乎總是比使用非聚簇索引快。每張表只能建一個聚簇索引,並且建聚簇索引需要至少相當該表120%的附加空間,以存放該表的副本和索引中間頁。
建立聚簇索引的思想是:
1.1、大多數表都應該有聚簇索引或使用分區來降低對表尾頁的競爭,在一個高事務的環境中,對最後一頁的封鎖嚴重影響系統的吞吐量。
1.2、在聚簇索引下,數據在物理上按順序排在數據頁上,重復值也排在一起,因而在那些包含范圍檢查(between、<、<=、& gt;、>=)或使用group by或order by的查詢時,一旦找到具有范圍中第一個鍵值的行,具有後續索引值的行保證物理上毗連在一起而不必進一步搜索,避免了大范圍掃描,可以大大提高查詢速度。
1.3、在一個頻繁發生插入操作的表上建立聚簇索引時,不要建在具有單調上升值的列(如IDENTITY)上,否則會經常引起封鎖沖突。
1.4、在聚簇索引中不要包含經常修改的列,因為碼值修改後,數據行必須移動到新的位置。
1.5、選擇聚簇索引應基於where子句和連接操作的類型。
聚簇索引的侯選列是:
1、主鍵列,該列在where子句中使用並且插入是隨機的。
2、按范圍存取的列,如pri_order > 100 and pri_order < 200。
3、在group by或order by中使用的列。
4、不經常修改的列。
5、在連接操作中使用的列。
2、SQLServer預設情況下建立的索引是非聚簇索引,由於非聚簇索引不重新組織表中的數據,而是對每一行存儲索引列值並用一個指針指向數據所在的頁面。換句話說非聚簇索引具有在索引結構和數據本身之間的一個額外級。一個表如果沒有聚簇索引時,可有250個非聚簇索引。每個非聚簇索引提供訪問數據的不同排序順序。在建立非聚簇索引時,要權衡索引對查詢速度的加快與降低修改速度之間的利弊。另外,還要考慮這些問題:
2.1、索引需要使用多少空間。
2.2、合適的列是否穩定。
2.3、索引鍵是如何選擇的,掃描效果是否更佳。
2.4、是否有許多重復值。
對更新頻繁的表來說,表上的非聚簇索引比聚簇索引和根本沒有索引需要更多的額外開銷。對移到新頁的每一行而言,指向該數據的每個非聚簇索引的頁級行也必須更新,有時可能還需要索引頁的分理。從一個頁面刪除數據的進程也會有類似的開銷,另外,刪除進程還必須把數據移到頁面上部,以保證數據的連續性。所以,建立非聚簇索引要非常慎重。
非聚簇索引常被用在以下情況:
1、某列常用於集合函數(如Sum,....)。
2、某列常用於join,order by,group by。
3、查尋出的數據不超過表中數據量的20%。
H. 資料庫中 聚簇索引 是什麼~
聚簇索引是一種對磁碟上實際數據重新組織以按指定的一個或多個列的值排序。由於聚簇索引的索引頁面指針指向數據頁面,所以使用聚簇索引查找數據幾乎總是比使用非聚簇索引快。每張表只能建一個聚簇索引,並且建聚簇索引需要至少相當該表120%的附加空間,以存放該表的副本和索引中間頁。
I. 聚簇索引和非聚簇索引的區別
聚簇索引和非聚簇索引的區別:
一、含義不同:
聚簇索引(Clustered Index)並不是一種單獨的索引類型,而是一種數據存儲方式。當表有了聚簇索引的時候,表的數據行都存放在索引樹的葉子頁中。
非聚簇索引(NoClustered Index),又叫二級索引。二級索引的葉子節點中保存的不是指向行的物理指針,而是行的主鍵值。
二、應用不同:
在《資料庫原理》裡面,對聚簇索引的解釋是:聚簇索引的順序就是數據的物理存儲順序,而對非聚簇索引的解釋是:索引順序與數據物理排列順序無關。正式因為如此,所以一個表最多隻能有一個聚簇索引。
在SQL Server中,索引是通過二叉樹的數據結構來描述的,我們可以這么理解聚簇索引:索引的葉節點就是數據節點。而非聚簇索引的葉節點仍然是索引節點,只不過有一個指針指向對應的數據塊。
相關如下:
因為聚簇和非聚簇索引本質上是數據存儲方式,需要依賴於載體,即以InnoDB引起來講解聚簇索引,以MyISAM來講解非聚簇索引。下述講解的圖都引用自《高性能MySQL》。
它的每個聚簇索引的葉子節點都包含主鍵值、事務ID、回滾指針(用於事務和MVCC)以及餘下的列。從物理文件也可以看出 InnoDB的數據文件只有數據結構文件.frm和數據文件.ibd其中.ibd中存放的是數據和索引信息 是存放在一起的。
J. 對比聚簇索引和非聚簇索引
不知從什麼角度來對比,只能說說各自的特點,希望對你有用。
1、聚簇索引
a) 一個索引項直接對應實際數據記錄的存儲頁,可謂「直達」
b) 主鍵預設使用它
c) 索引項的排序和數據行的存儲排序完全一致,利用這一點,想修改數據的存儲順序,可以通過改變主鍵的方法(撤銷原有主鍵,另找也能滿足主鍵要求的一個欄位或一組欄位,重建主鍵)
d) 一個表只能有一個聚簇索引(理由:數據一旦存儲,順序只能有一種)
2、非聚簇索引
a) 不能「直達」,可能鏈式地訪問多級頁表後,才能定位到數據頁
b) 一個表可以有多個非聚簇索引