對於大多數的非專業的資料庫
操作人員來講,比如我們這些軟體開發人員,在很大程度上都搞不清楚資料庫索引的一些基本知識,有些是知其一不知其二,或者是知其然不知其所以然。造成這種情況的主要原因我覺的是行業原因,有很多公司都有自己的資料庫工程師,他們會幫助你優化sql
,開發人員即使不懂優化問題也不大,所以開發人員對這方面也就不會下太多功夫去了解sql優化,但如果公司沒有這樣的dba呢,就只能靠程式設計師自己了。其實了解這方面知識對自己還是有很大的幫助的。索引設計的好與壞對效能的影響是很大的。下面就來好好介紹下什麼是聚集和非聚集索引吧。
大家可能認為這個問題難度不大,認為太熟悉了,也許不會感興趣,但你真能說清楚嗎?其實要想說明白這兩者的差別也不是三兩句就說的清的,那天我也是覺的這問題太泛了,就隨便說了其中的兩個區別:
1、聚集索引乙個表只能有乙個,而非聚集索引乙個表可以存在多個,這個跟沒問題沒差別,地球人都知道。
2、聚集索引儲存記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理儲存並不連續,地球人也都知道。
但何為邏輯連續和物理儲存聯絡呢。
其實上面的我們需要搞清楚以下幾個問題:
第一:聚集索引的約束是唯一性,是否要求欄位也是唯一的呢?
分析:如果認為是的朋友,可能是受系統預設設定的影響,一般我們指定乙個表的主鍵,如果這個表之前沒有聚集索引,同時建立主鍵時候沒有強制指定使用非聚集索引,sql會預設在此字段上建立乙個聚集索引,而主鍵都是唯一的,所以理所當然的認為建立聚集索引的字段也需要唯一。
結論:聚集索引可以建立在任何一列你想建立的字段上,這是從理論上講,實際情況並不能隨便指定,否則在效能上會是惡夢。
第二:為什麼聚集索引可以建立在任何一列上,如果此表沒有主鍵約束,即有可能存在重複行資料呢?
粗一看,這還真是和聚集索引的約束相背,但實際情況真可以建立聚集索引。
分析其原因是:如果未使用 unique 屬性建立聚集索引,資料庫引擎將向表自動新增乙個四位元組 uniqueifier 列。必要時,資料庫引擎 將向行自動新增乙個 uniqueifier 值,使每個鍵唯一。此列和列值供內部使用,使用者不能檢視或訪問。
第三:是不是聚集索引就一定要比非聚集索引效能優呢?
如果想查詢學分在60-90之間的學生的學分以及姓名,在學分上建立聚集索引是否是最優的呢?
答:否。既然只輸出兩列,我們可以在學分以及學生姓名上建立聯合非聚集索引,此時的索引就形成了覆蓋索引,即索引所儲存的內容就是最終輸出的資料,這種索引在比以學分為聚集索引做查詢效能更好。
第四:在資料庫中通過什麼描述聚集索引與非聚集索引的?
索引是通過二叉樹的形式進行描述的,我們可以這樣區分聚集與非聚集索引的區別:聚集索引的葉節點就是最終的資料節點,而非聚集索引的葉節仍然是索引節點,但它有乙個指向最終資料的指標。
第五:在主鍵是建立聚集索引的表在資料插入上為什麼比主鍵上建立非聚集索引表速度要慢?
有了上面第四點的認識,我們分析這個問題就有把握了,在有主鍵的表中插入資料行,由於有主鍵唯一性的約束,所以需要保證插入的資料沒有重複。我們來比較下主鍵為聚集索引和非聚集索引的查詢情況:聚集索引由於索引葉節點就是資料頁,所以如果想檢查主鍵的唯一性,需要遍歷所有資料節點才行,但非聚集索引不同,由於非聚集索引上已經包含了主鍵值,所以查詢主鍵唯一性,只需要遍歷所有的索引頁就行(
索引的儲存空間比實際資料要少
),這比遍歷所有資料行減少了不少io消耗。這就是為什麼主鍵上建立非聚集索引比主鍵上建立聚集索引在插入資料時要快的真正原因。
所以總結如下:
動作描述
使用聚集索引
使用非聚集索引
列經常被分組排序應應
返回某範圍內的資料應不應
乙個或極少不同值
不應不應
小數目的不同值應不應
大數目的不同值不應應
頻繁更新的列不應應
外來鍵列應
應主鍵列應應
頻繁修改索引列不應應
聚集索引 和 非聚集索引區別
一.mysql的索引 mysql中,不同的儲存引擎對索引的實現方式不同,大致說下myisam和innodb兩種儲存引擎。myisam的b tree的葉子節點上的data,並不是資料本身,而是資料存放的位址。主索引和輔助索引沒啥區別,只是主索引中的key一定得是唯一的。這裡的索引都是非聚簇索引。myi...
聚集索引和非聚集索引區別
聚集索引 資料行的物理順序與列值 一般是主鍵那一列 的邏輯順序相同,乙個表只能擁有乙個聚集索引!非聚集索引 該索引中索引的邏輯順序與磁碟上行的物理順序不同乙個表可以擁有多個非聚集索引!非聚集索引可細分成普通索引,唯一索引,全文索引 區別 聚集索引 可以幫助把很大的範圍,迅速減小範圍。但是查詢該記錄,...
聚集索引和非聚集索引的區別
暫且摘錄如下 摘錄1 前者加在不常更新的表,後者加在經常更新的表 摘錄2 使用聚集索引 聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣...