日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

聚簇索引和聚簇索引介绍

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聚簇索引和聚簇索引介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自??聚簇索引和聚簇索引介紹

一.????什么是索引和建立索引的好處

  • 什么是索引

  在數據庫中,索引的含義與日常意義上的“索引”一詞并無多大區別,與書中的索引一樣,數據庫中的索引使您可以快速找到表中的特定信息。索引包含從表中一個或多個列生成的鍵,以及映射到指定數據的存儲位置的指針,也就是說索引由鍵和?指針組成。它是用于提高數據庫表數據訪問速度的數據庫對象。

  • 建立索引的好處:

    • 索引可以避免全表掃描。多數查詢可以僅掃描少量索引頁及數據頁,而不是遍歷所有數據頁。
    • 對于非聚集索引,有些查詢甚至可以不訪問數據頁。如字典的目錄就可以查到所有拼音第一字母為z?的所有字。
    • ?聚集索引可以避免數據插入操作集中于表的最后一個數據頁。
    • ?一些情況下,索引還可用于避免排序操作。

二.基礎知識

2.1?頁

? ?數據庫文件存儲是已頁為存儲單元的,一個頁是8K(8192Byte),一個頁就可以存放N行數據。我們常用的頁類型就是數據頁和索引頁。一個頁中除了存放基本數據之外還需要存放一些其他的數據,如頁的信息、偏移量等,如下圖所示。

? ?雖然SQLServer是以頁為單位存儲數據,但是其分配空間是以一個盤區為單位的(8個頁=64K),這樣做的目的主要是為提高I/O的性能。

?

一條索引記錄中包含的基本信息包括:鍵值?+?邏輯指針。

?

SQLServer中使用頁為存儲單元的,那么在建立索引時,其索引節點就是頁了,然后樹的鍵值就是存放到這些頁(節點)中的。就是說表中的數據行就是存放到頁上的,一個表有多個頁構成,這些頁以樹的結構存放。

2.2?B樹

? ?B樹即二叉搜索樹,所有非葉子節點最低擁有兩個子節點,基本信息如下圖所示。都是小的元素放左邊,大的元素放右邊。比如說要查找某個元素,其時間復雜度就對應該元素的深度,如要查詢9,從根節點開始,只要比較三次就找到他了,其查詢效率是非常高的。

? ?子節點:最多兩個子節點(指針分別指向Left和Right)

階數(節點子節點個數):2

深度:就是層數,各個葉子節點不一定一樣,如節點21的深度為4,40的深度為3

?

?

2.2?B-樹

B-樹是一中多路搜索樹,其階數可以自定義(>2),是很多數據及文件系統應用的一種索引結構,基本特征如:

1)?階數(M)>2,即孩子數量大于2個

2)?每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)

3)?非葉子結點上的多個關鍵字是按照順序排列的:K[1],?K[2],?…,?K[M-1];且K[i]?<?K[i+1];

4)?所有葉子節點都位于同一層,因此葉子節點的深度都是一樣的

5)?非葉子結點的關鍵字個數=指向兒子的指針個數-1;

6)?非葉子結點的指針:P[1],?P[2],?…,?P[M];其中P[1]指向關鍵字小于K[1]的子樹,P[M]指向關鍵字大于K[M-1]的子樹,其它P[i]指向關鍵字屬于(K[i-1],?K[i])的子樹;

如下圖是一個三階的B-樹,節點[18]有兩個指針分別指向其2個子節點。

?

這時如果要插入一個值17,其處理步驟:

1)?從根節點進入,17小于22,進入左邊的節點[18];

2)?[18]不是葉子節點,繼續向下搜索,17小于18,進入其左邊的子節點[12,16];

3)?[12,16]為葉子節點,插入到該節點;

4)?節點[12,16,17]元素大于2了(3階樹的節點關鍵字數量應>3/2-1,<3-1),因此該節點需要分裂,分裂中間的元素16到父節點18中去;

5)?12,17分裂成了兩個子節點了;

分裂后的效果如下圖

?

? ?以上圖片效果來自一個外國大學里面的的在線版B-樹的測試,網站:http://www.cs.usfca.edu/~galles/visualization/BTree.html?,大家可以去這個網站測試,效果很直觀,外國人就是牛。本人以前用C#+GDI實現過類似的效果,結果還是可以的,就是當樹太大的時候,布局不好處理了。

?

2.3?B+樹

B+樹是B-樹的變體,也是一種多路搜索樹,一棵m?階的B+樹和m?階的B-樹的差異在于:?

l?非葉子節點的子節點和其關鍵字相同,即節點有三個元素(關鍵字),他就肯定有三個子節點;?

l?非葉子節點的子節點P[i],指向關鍵字值屬于[K[i],?K[i+1])的子樹(B-樹是開區間);?

l?所有葉子節點增加一個鏈指針;?

l?所有關鍵字的數據都在葉子節點中;

?如下圖所示,圖片來自網絡(http://www.cnblogs.com/chjw8016/archive/2011/03/08/1976891.html)。

?

?

三:什么是聚集索引

3.1???????????聚集索引定義

聚集索引是根據數據行的鍵值在表中排序存儲數據行。索引定義中包含聚集索引列。每個表只能有一個聚集索引。只有當表包含聚集索引時,表中的數據行才按排序順序存儲。如果表具有聚集索引,則該表稱為聚集表。集索引決定了表數據的存儲順序,如果表沒有聚集索引,則其數據行存儲在一個稱為堆的無序結構中。

?

3.2???????????聚集索引的結構

對于某個聚集索引,索引指向該聚集索引某個特定分區(數據頁)的頂部。SQL Server?將在索引中向下移動以查找與某個聚集索引鍵對應的行。原因是聚集索引的索引順序就是數據排列順序。

?

  • ?聚集索引與查詢操作

  • 如上圖,在建立聚集索引后,當需要在根據此字段查找特定的記錄時,數據庫系統會根據特定的系統表查找的此索引的根,然后根據指針查找下一個,直到找到。數據查詢時首先是對索引表查詢,如果此時索引表在緩存中可以找到,則可以避免一次IO操作。在索引表中找到所需數據索引值后,就可以確定目標數據行所在的數據位置,從而讀取數據。
  • ?聚集索引與插入和刪除操作

  • 插入數據時,首先根據索引找到對應的數據頁,然后通過挪動已有的記錄為新數據騰出空間,最后插入數據。
  • 刪除數據時將導致其下方的數據行向上移動以填充刪除記錄造成的空白。
  • 對于數據的刪除操作,可能導致索引頁中僅有一條記錄,這時,該記錄可能會被移至鄰近的索引頁中,原索引頁將被回收,即所謂的“索引合并”。同樣插入數據頁會更改索引。每一次索引更改都是一次IO操作。
  • 聚集索引的建立會降低數據插入和刪除的效率。

四.???????什么是非聚集索引

4.1???????????非聚集索引定義

非聚集索引并不是在物理上排列數據,即索引中的邏輯順序并不等同于表中行的物理順序,索引是指向表中行的位置的指針,這些指針本身是有序的,通過這些指針可以在表中快速定位數據。

?

4.2???????????非聚集索引的結構

由于非聚集索引數據存儲時無序的,所以在非聚集索引中指針包含數據行在數據頁中的偏移量。即指針由?數據頁?+?數據行偏移量?組成。

?

  • ?非聚集索引的查詢

  • 如上圖,在建立非聚集索引后,當需要在根據此字段查找特定的記錄時,數據庫系統會根據特定的系統表查找的此索引的根,然后根據指針查找,直到找到。數據查詢時首先是對索引表查詢,如果此時索引表在緩存中可以找到,則可以避免一次IO操作。在索引表中找到所需數據索引值后,就可以確定目標數據行所在的數據位置,從而讀取數據。
  • 非聚集索引的插入刪除

    •   如果一張表包含一個非聚集索引但沒有聚集索引,則新的數據將被插入到最末一個數據頁中,然后非聚集索引將被更新。如果也包含聚集索引,該聚集索引將被用于查找新行將要處于什么位置,隨后,聚集索引、以及非聚集索引將被更新。

  如果在刪除命令的Where子句中包含的列上,建有非聚集索引,那么該非聚集索引將被用于查找數據行的位置,數據刪除之后,位于索引葉子上的對應記錄也將被刪除。如果該表上有其它非聚集索引,則它們葉子結點上的相應數據也要刪除

?

?五。聚集索引和非聚集的區別

聚集索引和非聚集索引的根本區別是數據記錄的排列順序和索引的排列順序是否一致,聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第一個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其后,從而縮小了搜索范圍,對于返回某一范圍的數據效果最好。

聚集索引的缺點是對表進行修改速度較慢,這是為了保持表中的記錄的物理順序與索引的順序一致,而把記錄插入到數據頁的相應位置,必須在數據頁中進行數據重排,降低了執行速度。
  非聚集索引指定了表中記錄的邏輯順序,數據記錄的物理順序和索引的順序不一致,聚集索引和非聚集索引都采用了B樹的結構,但非聚集索引的葉子層順序并不與實際的數據頁相同,而采用指向表中的記錄在數據頁中位置的方式。非聚集索引比聚集索引層次多,添加記錄不會引起數據順序的重組。在有大量不同數據的列上建立非聚集索引,可以提高數據的查詢和修改速度。

在對聚集索引列查詢時,聚集索引的速度要比非聚集索引速度快。

在對聚集索引列排序時,聚集索引的速度要比非聚集索引速度快。但是如果數據量比較大時,如10萬以上,則二者的速度差別不明顯。

?聚集索引和非聚集的建立原則

在創建索引時要做到三個適當,即在適當的表上、適當的列上創建適當數量的索引。雖然這可以通過一句話來概括優化的索引的基本準則,但是要做到這一點的話,需要做出很大的努力。具體的來說,要做到這個三個適當有如下幾個要求。

5.1???????????根據表的大小來創建索引。

雖然給表創建索引,可以提高查詢的效率。但是需要注意的是,索引也需要一定的開銷的。為此并不是說給所有的表都創建索引,那么就可以提高數據庫的性能。這個認識是錯誤的。給所有的表都創建了索引,那么其反而會給數據庫的性能造成負面的影響。因為此時濫用索引的開銷可能已經遠遠大于由此帶來的性能方面的收益。所以,數據庫管理員首先需要做到,為合適的表來建立索引,而不是為所有的表建立索引。

一般來說,不需要為比較小的表創建索引。因為即使建立了索引,其性能也不會得到很大的改善。相反索引建立的開銷,如維護成本等等,要比這個要大。也就是說,付出的要比得到的多,顯然違反常理。

另外,就是對于超大的表,也不一定要建立索引。有些表雖然比較大,記錄數量非常的多。但是此時為這個表建立索引并一定的合適。對于一些超大的表,建立索引有時候往往不能夠達到預計的效果。而且在大表上建立索引,其索引的開銷要比普通的表大的多。那么到底是否給大表建立索引呢?主要是看兩個方面的內容。首先是需要關注一下,在這張大表中經常需要查詢的記錄數量。一般來說,如果經常需要查詢的數據不超過10%到15%的話,那就沒有必要為其建立索引的必要。因為此時建立索引的開銷可能要比性能的改善大的多。如果數據庫管理員需要得出一個比較精確的結論,那么就需要進行測試分析。

5.2???????????根據列的特征來創建索引

列的特點不同,索引創建的效果也不同。需要了解為哪些列創建索引可以起到事半功倍的效果。同時也需要了解為哪些列創建索引反而起到的是事倍功半的效果。

索引設置的是否恰當,不僅跟數據庫設計架構有關,而且還跟企業的經濟業務相關。雖然一開始已經做了索引的優化工作。但是隨著后來經濟數據的增加,這個索引的效果會越來越打折扣。所以需要隔一段時間,對數據庫的索引進行優化。該去掉的去掉,該調整的調整,以提高數據庫的性能。

?

5.3???????????在一個表上創建多少索引合適

通常來說,表的索引越多,其查詢的速度也就越快。但是,表的更新速度則會降低。這主要是因為表的更新同時也是索引的更新。到底在表中創建多少索引合適,就需要在這個更新速度與查詢速度之間取得一個均衡點。如對于一些數據倉庫或者決策型數據庫系統,其主要用來進行查詢。相關的記錄往往是在數據庫初始化的時候導入。此時,設置的索引多一點,可以提高數據庫的查詢性能。同時因為記錄不怎么更新,所以索引比較多的情況下,也不會影響到更新的速度。相反,如果那些表中經常需要更新記錄,如一些事務型的應用系統,數據更新操作是家常便飯的事情。此時如果在一張表中建立過多的索引,則會影響到更新的速度。由于更新操作比較頻繁,所以對其的負面影響,要比查詢效率提升要大的多。此時就需要限制索引的數量,只在一些必要的字段上建立索引。

總之,在適當的表、適當的列上建立適當的索引。具體的索引優化內容還是需要在日常工作中繼續體會與總結。

下面的表總結了何時使用聚集索引或非聚集索引:

動作描述

使用聚集索引

使用非聚集索引

列經常被分組排序

返回某范圍內的數據

不應

一個或極少不同值

不應

不應

小數目的不同值

不應

大數目的不同值

不應

頻繁更新的列

不應

外鍵列

主鍵列

頻繁修改索引列

不應

?注:具體參考數據庫\聚簇索引和非聚簇索引.ppt

總結

以上是生活随笔為你收集整理的聚簇索引和聚簇索引介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。