關於非簇索引中儲存的簇索引的RID還是指標的問題
昨晚遇到了阿少,這小子又換了馬甲,差點認不出,他現在正在做資料儲存這塊,也就是想自己做個儲存引擎,所以對MSSQL的儲存這塊研究的比較深入,他提出了關於非簇索引中儲存的是簇索引的RID還是指標的問題,他堅持說是儲存的一個指標,就是指向簇索引中資料的指標,我查了一晚上資料,本來這幾天事情很多,精力不集中,而且有點頭疼,索引看了很久才看到了點資訊,具體總結如下:
1、如果一個表上有兩個索引,一個是簇索引,另一個是非簇索引,那麼非簇索引中除了儲存鍵值外,還儲存簇索引的鍵值,透過非簇索引查詢資料時,要先獲取非簇的鍵值,然後獲取簇的鍵值,因為他們在非簇裡是儲存在一起的,然後透過簇索引的鍵值,在到簇索引的根節點,然後一級級的查下去,直到簇索引葉子節點的相應的資料,這樣,非簇索引裡不儲存簇索引資料行的RID,而是儲存的簇索引的鍵值,雖然在查詢簇索引的資料時多走幾個節點,然而,在維護非簇索引時可能要省不少勁,因為這牽扯到簇索引節點分裂時非簇索引的維護問題。
2、另一點讓我感到慚愧的是,雖然接觸資料庫這麼多年,基本理論也看過一點,然而對堆的理解還是那麼膚淺,甚至認為索引也是一個堆,透過和阿少討論,加深了我對堆概念的理解,所謂堆就是當一行新插入表時,需要獲取空間來容納新插入資料,那麼這個空間在堆裡任何一個地方都可以,只要能放開新插入的資料就可以,而索引不同,它必須把新插入行的鍵值插入到該插入的位置才可以,因為索引裡的鍵值的排列是有順序的。
3、此外,阿少還提到,在簇索引中,當分裂頁時,新插入行以後的所有地址即RID都要一次向後挪動,也就是都要改變RID,我的思考,不需要一次向後挪動,因為索引的頁是雙向連結串列,只需在連結串列中加入新的頁就可以了,需要改動RID的資料行只涉及到新新增到連結串列裡的頁,而其他資料頁的資料並未挪動,因此RID也並沒發生變化,但即使如此,在頁分裂時,包括分支節點和葉節點的工作量,也是比較大的,對維護費簇索引來說也是不少的開銷,尤其是對那些經常發生改變的簇索引來說。
1、如果一個表上有兩個索引,一個是簇索引,另一個是非簇索引,那麼非簇索引中除了儲存鍵值外,還儲存簇索引的鍵值,透過非簇索引查詢資料時,要先獲取非簇的鍵值,然後獲取簇的鍵值,因為他們在非簇裡是儲存在一起的,然後透過簇索引的鍵值,在到簇索引的根節點,然後一級級的查下去,直到簇索引葉子節點的相應的資料,這樣,非簇索引裡不儲存簇索引資料行的RID,而是儲存的簇索引的鍵值,雖然在查詢簇索引的資料時多走幾個節點,然而,在維護非簇索引時可能要省不少勁,因為這牽扯到簇索引節點分裂時非簇索引的維護問題。
2、另一點讓我感到慚愧的是,雖然接觸資料庫這麼多年,基本理論也看過一點,然而對堆的理解還是那麼膚淺,甚至認為索引也是一個堆,透過和阿少討論,加深了我對堆概念的理解,所謂堆就是當一行新插入表時,需要獲取空間來容納新插入資料,那麼這個空間在堆裡任何一個地方都可以,只要能放開新插入的資料就可以,而索引不同,它必須把新插入行的鍵值插入到該插入的位置才可以,因為索引裡的鍵值的排列是有順序的。
3、此外,阿少還提到,在簇索引中,當分裂頁時,新插入行以後的所有地址即RID都要一次向後挪動,也就是都要改變RID,我的思考,不需要一次向後挪動,因為索引的頁是雙向連結串列,只需在連結串列中加入新的頁就可以了,需要改動RID的資料行只涉及到新新增到連結串列裡的頁,而其他資料頁的資料並未挪動,因此RID也並沒發生變化,但即使如此,在頁分裂時,包括分支節點和葉節點的工作量,也是比較大的,對維護費簇索引來說也是不少的開銷,尤其是對那些經常發生改變的簇索引來說。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-605584/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL中的聚簇索引和非聚簇索引MySql索引
- 淺談聚簇索引與非聚簇索引索引
- MySQL聚簇索引和非聚簇索引的原理及使用MySql索引
- 一分鐘明白MySQL聚簇索引和非聚簇索引MySql索引
- 聚簇索引和非聚簇索引到底有什麼區別?索引
- [MySQL]為什麼非聚簇索引不儲存資料位置MySql索引
- 聚簇索引索引
- 一看就懂的MySQL的聚簇索引,以及聚簇索引是如何長高的MySql索引
- 【Mysql】InnoDB 中的聚簇索引、二級索引、聯合索引MySql索引
- 資料庫表,索引(索引組織表,聚簇表,聚簇索引,)資料庫索引
- MySQL 聚簇索引 和覆蓋索引MySql索引
- 資料庫聚簇索引——not null條件對唯一鍵索引成為聚簇索引的影響資料庫索引Null
- Oracle對錶、索引和簇的分析Oracle索引
- InnoDB學習(八)之 聚簇索引索引
- 關於索引聚簇因子(CLUSTERING_FACTOR)引起的sql優化過程索引SQL優化
- MySQL的B+Tree索引到底是咋回事?聚簇索引到底是如何長高的?MySql索引
- oracle中的簇Oracle
- Oracle的簇與簇表Oracle
- SQL Server 深入解析索引儲存(非聚集索引)SQLServer索引
- MySQL 聚簇索引一定是主鍵嗎MySql索引
- MySQL innodb如何選擇一個聚簇索引MySql索引
- SQL Server 資料儲存與 NTFS 簇的大小SQLServer
- mysql關於聚集索引、非聚集索引的總結MySql索引
- 關於函式索引的問題?函式索引
- SQL Server資料儲存與NTFS簇的大小PXSQLServer
- 唯一索引和非唯一索引ROWID儲存的區別索引
- 關於索引是否該rebuild的問題索引Rebuild
- 淺談索引系列之聚簇因子(clustering_factor)索引
- clustering factor索引聚簇因子和執行計劃索引
- 轉載-treedump索引讀取索引儲存的資料值--非唯一性索引索引
- 一篇文章講清楚MySQL的聚簇/聯合/覆蓋索引、回表、索引下推MySql索引
- 關於InnoDB表資料和索引資料的儲存索引
- 理解索引和聚簇——效能調整手冊和參考索引
- 關於二維陣列指標的問題陣列指標
- c中關於指標的宣告和定義的一些問題指標
- 關於Swift中的指標的那些事Swift指標
- 【實驗】【聚簇】聚簇(Cluster)和聚簇表(Cluster Table)的建立與總結
- 函式索引的儲存函式索引