HBase 索引建立

2021-06-19 08:52:33 字數 2893 閱讀 4469

本文參考了文「mysql索引背後的資料結構及演算法原理」,之所以還要摘錄,主要是為了形成hbase索引研究的開篇,弄明白什麼索引的本質,如有版權問題,請及時通知。

索引的本質

索引是幫助mysql高效獲取資料的資料結構。索引屬於資料結構的一種。

在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這個資料結構就是索引。

例子:

圖1展示一種可能的索引。左邊是資料,一共2列,共7條記錄,最左邊是資料記錄的實體地址(邏輯上相鄰的記錄在磁碟上並不一定是物理相鄰的)。為了加快col2的查詢,維護一共右邊的二叉樹,每個節點包含索引鍵值和乙個指向資料庫實體地址的指標,這樣就可以運用二叉樹在o(log2n)的複雜度內獲取資料。

b-tree和b+tree

目前大部分資料庫系統和檔案系統都採用b-tree或其變種b+tree作為索引結構。

b-樹定義:b-樹是一種平衡的多路查詢樹。一顆m階的b-樹,或為空樹,或為滿足下列特徵的m叉樹:

⑴每個節點最多有m棵子樹;

⑵若跟節點不是葉子節點,則至少有2棵子樹;

⑶除跟之外的所有非終端節點至少有[m/2]棵子樹;

⑷所有非重點節點包含以下資訊:(n,k1,a1,k…,kn,an)其中:

ki(i=1,…,n)為關鍵字,且ki

i+1ai(1=1,…,n)為指向子樹跟節點的指標,且ai-1所指示子樹中所有節點的關鍵字的值都小於ki,ai所指示子樹所有節點的關鍵字的值都大於ki

⑸所有的葉子節點都出現在同一層上

如:(m=3)的b-樹

b-樹索引,從根節點開始,對節點內關鍵字進行二份查詢,如果命中,則結束,否則進入查詢關鍵字所屬範圍的兒子節點,重複,知道對應的兒子節點指標為空或已經是葉子節點。

b-樹特徵:

⑴關鍵字集合分布在整棵樹中;

⑵任何關鍵字出現且只出現在乙個節點中;

b+樹:b-樹的一種變型樹,它與b-樹的差異在於:

⑴有n棵子樹的結點含有n個關鍵字;

⑵所有的葉子節點包含全部關鍵字資訊,及指向這些關鍵字的指標,且葉子節點之間是自小而大順序鏈結;

⑶所有非葉子節點僅包含其子樹最大(或最小)關鍵字。

通常b+樹有2個頭指標,乙個指向頭指標,乙個指向關鍵字最小的葉子節點。下圖為乙個b+樹的示例圖:

b+樹索引,在查詢時,若非葉子節點的關鍵字等於給定值,並不終止,而是繼續向下,直至葉子節點。

一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式存在磁碟上,索引查詢過程中就要產生磁碟i/o操作,因此索引要儘量減少查詢過程的i/o訪問次數。

主存儲存原理

目前計算機的主存基本都是隨機讀取儲存器(ram),下圖展現了乙個主存模型:

主存是一系列的儲存單元組成的矩陣,每個儲存單元儲存固定大小的資料。每個儲存單元有唯一的位址,通過行位址和列位址可以唯一定位乙個儲存單元。當系統需要讀取主存時,則將位址訊號放在位址匯流排上傳給主存,主存讀到位址訊號,解析訊號並定位到制定的儲存單元,然後將此儲存單元上資料放在資料匯流排上,供其他部件讀取。寫主存類似,系統將要寫入的位址和資料分別放在位址匯流排和資料匯流排上,主存讀取2個匯流排的內容,做相應的寫操作。

磁碟訪問原理

索引檢索需要磁碟io,磁碟io存在機械運動耗費,因此磁碟io的時間消耗是巨大的:

乙個磁碟由大小相同且同軸的圓盤組成,圓盤可以轉動。在磁碟的一側有磁頭支架,磁頭支架固定一組磁頭,每個磁頭負責訪問乙個磁碟的內容,磁頭不能運動,但可以沿半徑方向運動。

磁碟被劃分為一系列同心環,圓心是磁碟的中心每個同心環叫做乙個磁軌;磁軌被沿半徑劃分為乙個個小的段,叫扇區。每個扇區是磁碟的最小儲存單位。

mysql索引實現

1、myisam索引實現

myisam引擎使用b+樹作為索引結構,葉子節點的data域存放的是資料記錄的位址,如下:

資料庫記錄存在磁碟的一塊地方,索引指示資料庫每條記錄的存放位址,從索引查詢到位址後,直接從該處讀取就可以獲得資料。此型別索引,主索引和輔助索引在結構上並沒有任何區別,指示主索引要求key是唯一的,而輔助索引key可以是重複的。

2、innodb索引實現

innodb也使用b+tree作為索引結構。但是⑴節點位置存放的不是資料位址,而是記錄值,如下:

上圖中葉子節點中包含完整的資料記錄。

這種索引使得按主鍵的搜尋十分高效,但輔助索引的搜尋需要2遍索引。

**:

Hbase 建立,插入,查詢

1.gang建立表 create user info 表名為user 有乙個列族為 info 2.檢視表 describe user 3.插入資料 put user 1 info age 20 put user 1 info name zhangsan 4.瀏覽表 scan user 5.檢視所有表...

Hbase二級索引

hbase的查詢都是通過rowkey 要把多條件組合查詢的字段都拼接在rowkey中顯然不太可能 或者全表掃瞄再結合過濾器篩選出目標資料 太低效 所以通過設計hbase的二級索引來解決這個問題。多個查詢條件構成了多維度的組合查詢,需要根據不同組合查詢出符合條件的資料。例如 按照電影維度查詢資料適合,...

c mysql建立索引 MySQL 建立索引

1 索引建立原則 1 搜尋的索引列,不一定是所要選擇的列。換句話說,最適合索引的列是出現在where子句中的列,或連線子句中指定的列,而不是出現在select關鍵字後的選擇列表中的列。2 使用唯一索引。考慮某列中值的分布。索引的列的基數越大,索引的效果越好。3 使用短索引。如果對字串列進行索引,應該...