普通索引和聚集索引以及B 樹的關係

2021-09-26 14:56:38 字數 1060 閱讀 8153

##索引

當我們在設計資料庫的時候,對錶的一些屬性有時會加上索引,但索引為什麼能提高檢索速率呢?是不是用了索引就一定可以提高效率呢?不同索引之間有什麼區別呢?搞懂這些問題是靈活運用索引的必備條件。接下來,我們將一 一進行討論。

索引也分為不同的種類,而且也有不同的分類方法,比較常用的是普通索引和聚集索引。

在b+tree的每個葉子節點增加乙個指向相鄰葉子節點的指標,就形成了帶有順序訪問指標的b+tree。做這個優化的目的是為了提高區間訪問的效能,例如圖中如果要查詢key為從18到49的所有資料記錄,當找到18後,只需順著節點和指標順序遍歷就可以一次性訪問到所有資料節點,極大提到了區間查詢效率。

可以看到b+樹對於表的儲存是一種很方便的資料結構。那麼為什麼不用紅黑樹呢,因為資料量大的時候,會導致這種二叉樹深度太深,io次數會很多,層數很少的b+樹可以有效降低io次數。

聚集索引和普通索引是不一樣的,聚集索引是指資料庫錶行中資料的物理順序與鍵值的邏輯(索引)順序相同。乙個表只能有乙個聚集索引,因為乙個表的物理順序只有一種情況。意思就是說上面的普通索引我們可以看到是另建了乙個表,然後當查詢到了索引沒有覆蓋到的字段的時候是將這個字段對映到了主表中然後進行查詢的。而聚集索引建立後主表本身就會按照這個索引的結構來儲存,意思就是說主表直接就按這個來存了。這也是為什麼聚集索引一定是唯一的原因,因為一張表中只能有一種儲存方式。

兩種索引誰更快呢?這當然是沒有懸念的,聚集索引更快咯,因為普通索引查到沒有覆蓋的字段的時候需要向主表中對映過去,然後再獲取,而聚集索引因為其本身就包含了所有資料,所以一次就好~

在我們新建乙個表時,如果沒有定義主鍵,那麼**的資料是順序線性儲存的,在定義的主鍵之後,因為主鍵預設有索引,並且在很多平台上預設是聚集索引,所以在主鍵定義的時候就會把整個表變為乙個樹形結構(如果主鍵是聚集索引),但要知道的是主鍵不一定是聚集索引,也可以是普通索引,只是很多平台預設為聚集,不要盲目劃等號。

那麼索引既然這麼快是不是越多越好呢?不存在的,因為索引本身是乙個資料表,那麼在插入或刪除的時候就涉及到了索引表的改變,b+樹的插入刪除涉及到很多節點操作,或許會消耗很多時間。所以我們對於常改變的字段不宜建索引,而對於改動較少的字段就很合適,在設計表的時候我們要靈活選取,才能高效。

索引以及聯合索引的使用

一.索引的使用 1.主鍵 預設是自帶索引的 和外來鍵 以及一些可以跟其他表關聯的字段 2.where子句中經常出現的字段 3.索引應該建在小字段上,大的資料字段 bit,image,text 不適用 二.聯合索引 1.查詢條件中出現聯合索引第一列或全部則能利用聯合索引 2.只要聯合條件全部在 3.查...

聚集索引和非聚集索引的區別

暫且摘錄如下 摘錄1 前者加在不常更新的表,後者加在經常更新的表 摘錄2 使用聚集索引 聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣...

聚集索引和非聚集索引的特點

索引分類 按照維護與管理索引角度分為 唯一索引 復合索引和系統自動建立的索引 按照儲存方式分為 聚集與非聚集索引 1 聚集索引 表中儲存的資料按照索引的順序儲存,檢索效率比普通索引高,索引占用硬碟 儲存空間小 1 左右 但對資料新增 修改 刪除的速度影響比較大 降低 特點 1 無索引,資料無序 2 ...