關於索引的B tree B

2022-06-23 21:23:41 字數 3488 閱讀 5592

索引分為聚簇索引和非聚簇索引。

以一本英文課本為例,要找第8課,直接翻書,若先翻到第5課,則往後翻,再翻到第10課,則又往前翻。這本書本身就是一個索引,即“聚簇索引”。

如果要找"fire”這個單詞,會翻到書後面的附錄,這個附錄是按字母排序的,找到f字母那一塊,再找到"fire”,對應的會是它在第幾課。這個附錄,為“非聚簇索引”。

由此可見,聚簇索引,索引的順序就是資料存放的順序,所以,很容易理解,一張資料表只能有一個聚簇索引。

聚簇索引要比非聚簇索引查詢效率高很多,特別是範圍查詢的時候。所以,至於聚簇索引到底應該為主鍵,還是其他欄位,這個可以再討論。

1、mysql的索引

mysql中,不同的儲存引擎對索引的實現方式不同,大致說下myisam和innodb兩種儲存引擎。

myisam的b+tree的葉子節點上的data,並不是資料本身,而是資料存放的地址。主索引和輔助索引沒啥區別,只是主索引中的key一定得是唯一的。這裡的索引都是非聚簇索引。

myisam還採用壓縮機制儲存索引,比如,第一個索引為“her”,第二個索引為“here”,那麼第二個索引會被儲存為“3,e”,這樣的缺點是同一個節點中的索引只能採用順序查詢。

innodb的資料檔案本身就是索引檔案,b+tree的葉子節點上的data就是資料本身,key為主鍵,這是聚簇索引。非聚簇索引,葉子節點上的data是主鍵(所以聚簇索引的key,不能過長)。為什麼存放的主鍵,而不是記錄所在地址呢,理由相當簡單,因為記錄所在地址並不能保證一定不會變,但主鍵可以保證。

至於為什麼主鍵通常建議使用自增id呢?

2、聚簇索引

聚簇索引的資料的物理存放順序與索引順序是一致的,即:只要索引是相鄰的,那麼對應的資料一定也是相鄰地存放在磁碟上的。如果主鍵不是自增id,那麼可以想象,它會幹些什麼,不斷地調整資料的實體地址、分頁,當然也有其他一些措施來減少這些操作,但卻無法徹底避免。但,如果是自增的,那就簡單了,它只需要一頁一頁地寫,索引結構相對緊湊,磁碟碎片少,效率也高。

聚簇索引不但在檢索上可以大大滴提高效率,在資料讀取上也一樣。比如:需要查詢f~t的所有單詞。

一個使用myisam的主索引,一個使用innodb的聚簇索引。兩種索引的b+tree檢索時間一樣,但讀取時卻有了差異。

因為myisam的主索引並非聚簇索引,那麼他的資料的實體地址必然是凌亂的,拿到這些實體地址,按照合適的演算法進行i/o讀取,於是開始不停的尋道不停的旋轉。聚簇索引則只需一次i/o。

不過,如果涉及到大資料量的排序、全表掃描、count之類的操作的話,還是myisam佔優勢些,因為索引所佔空間小,這些操作是需要在記憶體中完成的。

鑑於聚簇索引的範圍查詢效率,很多人認為使用主鍵作為聚簇索引太多浪費,畢竟幾乎不會使用主鍵進行範圍查詢。但若再考慮到聚簇索引的儲存,就不好定論了。

學習筆記】mysql索引原理之b+/-tree

索引,是為了更快的查詢資料,查詢演算法有很多,對應的資料結構也不少,資料庫常用的索引資料結構一般為b+tree。

1、b-tree

關於b-tree的官方定義個人覺得比較難懂,通俗一點就是舉個例子。假如:一本英文字典,單詞+詳細解釋組成了一條記錄,現在需要索引單詞,那麼以單詞為key,單詞+詳細解釋為data,b-tree就是以一個二元組來定義一條記錄。如果一個節點有3條記錄,那麼會有對應的4個指標,用以指向下一個節點。b-tree是有序且平衡的,所有葉子節點在同一層,即不會出現某個分支層級多,某個分支層級少的情況。

因為b-tree是有序的,所以它的查詢就簡單了,先從根節點開始二分查詢,找到則返回節點;否則沿著區間指標查詢下一個節點。比如,查詢false這個單詞。

2、b+tree

與b-tree不同的是,b+tree每個節點只有key,沒有data;而且葉子節點沒有指標。也就是說b+tree的葉子節點和內節點的資料結構是不一樣的。

一般資料庫採用的是b+tree,而且經過了一些優化,比如在葉子節點上增加了順序訪問指標,提高區間查詢效率。比如:查詢首字母為f~t的所有單詞。那麼只需查到f開頭的第一個單詞fabric,然後沿著葉子節點的開始遍歷,直到找到最後一個以t開頭的單詞為止。

簡單介紹了b-/+tree,至於眾多資料結構中,為何資料庫索引選擇btree,而且選擇b+tree,下面從計算機儲存原理方面簡單說說。

3、讀記憶體和讀磁碟

記憶體讀取和磁碟讀取的效率是相差很大的。

簡單點說說記憶體讀取,記憶體是由一系列的儲存單元組成的,每個儲存單元儲存固定大小的資料,且有一個唯一地址。

當需要讀記憶體時,將地址訊號放到地址匯流排上傳給記憶體,記憶體解析訊號並定位到儲存單元,然後把該儲存單元上的資料放到資料匯流排上,回傳。

寫記憶體時,系統將要寫入的資料和單元地址分別放到資料匯流排和地址匯流排上,記憶體讀取兩個匯流排的內容,做相應的寫操作。

記憶體存取效率,跟次數有關,先讀取a資料還是後讀取a資料不會影響存取效率。而磁碟存取就不一樣了,磁碟i/o涉及機械操作。

磁碟是由大小相同且同軸的圓形碟片組成,磁碟可以轉動(各個磁碟須同時轉動)。磁碟的一側有磁頭支架,磁頭支架固定了一組磁頭,每個磁頭負責存取一個磁碟的內容。磁頭不動,磁碟轉動,但磁臂可以前後動,用於讀取不同磁軌上的資料。磁軌就是以碟片為中心劃分出來的一系列同心環(如圖示紅那圈)。磁軌又劃分為一個個小段,叫扇區,是磁碟的最小儲存單元。

磁碟讀取時,系統將資料邏輯地址傳給磁碟,磁碟的控制電路會解析出實體地址,即哪個磁軌哪個扇區。於是磁頭需要前後移動到對應的磁軌,消耗的時間叫尋道時間,然後磁碟旋轉將對應的扇區轉到磁頭下,消耗的時間叫旋轉時間。所以,適當的操作順序和資料存放可以減少尋道時間和旋轉時間。

為了儘量減少i/o操作,磁碟讀取每次都會預讀,大小通常為頁的整數倍。即使只需要讀取一個位元組,磁碟也會讀取一頁的資料(通常為4k)放入記憶體,記憶體與磁碟以頁為單位交換資料。因為區域性性原理認為,通常一個資料被用到,其附近的資料也會立馬被用到。

4、檢索效能分析

b-tree:如果一次檢索需要訪問4個節點,資料庫系統設計者利用磁碟預讀原理,把節點的大小設計為一個頁,那讀取一個節點只需要一次i/o操作,完成這次檢索操作,最多需要3次i/o(根節點常駐記憶體)。資料記錄越小,每個節點存放的資料就越多,樹的高度也就越小,i/o操作就少了,檢索效率也就上去了。

b+tree:內節點只存key,大大滴減少了內節點的大小,那麼每個節點就可以存放更多的記錄,樹的更矮了,i/o操作更少了。所以b+tree擁有更好的效能。

5、其他索引方式

雜湊索引:通過hash來定位的一種索引,這種索引用的較少,通過用於單值查詢。innodb的自適應索引就是hash索引。

點陣圖索引:欄位值固定且少,比如性別、狀態。在同時對多個這樣的欄位and/or查詢時,效率極高,直接按位與/或就可以得到結果了。所以,應用範圍侷限。

B2B行業需要什麼型別的銷售?

文 史彥澤 銷售易crm創始人 ceo 在當今的經濟環境下,b2b銷售所面臨的壓力越來越大,如何提升銷售團隊能力成為銷售管理層以及銷售人員都...

B 夕哥的筆記

功效 減脂,消水腫,修腿型 動作要點 上半身保持不動,腹部收緊,勾腳尖,腰不要拱起,以慢為佳,動作儘量標準。 數量 蹬5組,每組35次 拉伸壯壯腿更要延長拉伸時間,別問我這是什麼原理,我也說不清楚,我也是在一堆瘦腿方法裡看到很多都講到了有效拉伸能瘦腿,然後自己挑了一些精華,我只知道這會瘦這會讓腿變好...

小心你的身邊有逗B

1 迎面走來一位妙齡少女,偶幾天來委靡不振的腰板一下挺直了,兩眼冒著青光,嘴角流著口水,一顆小心 撲通撲通 的跳著,心想 嘿嘿,是該出手的時...