聚集索引、非聚集索引、主鍵


關於這幾個概念的理解

首先要知道索引是一種數據結構,這個數據結構是由數據庫本身來維護的,當刪除、插入、更新數據的時候,索引自身的數據結構也在不斷維護中。

索引是基於二叉樹的結構來維護的,主要是為了快速檢索數據

二叉樹結構中有葉節點和非葉節點,葉節點就是沒有分支的最后節點,顧名思義就像葉子一樣

那么聚集索引,聚集索引的葉節點存儲的就是數據本身,這就意味着,聚集索引決定了數據的物理存儲順序。因此聚集索引在單葉節點中是一個連續存儲的數據。所以對於between < > 等范圍查詢,聚集索引效率會很高,因為數據本身就是連續存儲的,但是對於頻繁更新的列不適合聚集索引,為什么?因為會頻繁更改變數據的物理地址,會影響性能。這里要說明的是,對於guid類型的主鍵列,聚集索引和非聚集索引那種更合適?個人認為非聚集索引更合適了,因為guid類型不會用到范圍查詢,只有=查詢,所以沒有必要使用聚集索引,但是對於自增列類型的,可以使用聚集索引,還有就是時間列,會經常用到> < =查詢也是適合聚集索引。聚集索引非常珍貴,因為一張表只有一個聚集索引,所以不要將聚集索引浪費在一個guid列中,在sqlserver數據庫中,主鍵默認的索引是聚集索引。

建索引時,如果存在聚集索引,應該先建立聚集索引,然后建立非聚集索引,否則會導致所有的非聚集索引重建。

那么非聚集索引,非聚集索引的葉節點存儲的不是數據,而是數據的物理地址,就像指針一樣,指向的是數據的地址,所以非聚集索引是一個非連續的數據。對於頻繁更新的索引列,並沒有更新實際的物理存儲地址,所以頻繁更新的列如果建立索引采用非聚集索引最合適,對於大數目的不同值適合非聚集索引,但是對於極少的不同值,建立索引就沒有多少意義了,舉個簡單的例子,假如有100萬條數據,類型只有AB兩種,那么不會起到快速檢索的效果。因此建立索引的原則不是越多越好,要根據實際情況建立。

主鍵是一種特殊的具有唯一約束的索引,可以是聚集索引或者非聚集索引,主鍵不可以為空,唯一約束的索引可以為空

最后總結一下主鍵、聚集索引、非聚集索引的使用

1.如果表中沒有特別的列要必須使用聚集索引,建議將主鍵設為聚集索引

2.如果表中某列頻繁使用范圍查詢,用到排序,譬如時間列,建議將主鍵設為非聚集索引,將排序列設為聚集索引

3.將大數目的不同值的列設為非聚集索引,譬如數據表中的門店ShopID、部門ID等

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM