索引是什麼大家都知道是加快查詢用的,是的,沒錯,索引的根本作用是縮小掃描範圍,而不是直接定位記錄,直接定位記錄只是索引的一種特殊情況,縮小範圍之後最終都是線性掃描得到結果。 就是按照某個值排序,這是最最基本的索引了,RDBMS里的聚集索引,別小看這種簡陋的東西,它是大數據里常用甚至是唯一可用的索引。 ...
- 什麼是索引?
索引是什麼大家都知道是加快查詢用的,是的,沒錯,索引的根本作用是縮小掃描範圍,而不是直接定位記錄,直接定位記錄只是索引的一種特殊情況,縮小範圍之後最終都是線性掃描得到結果。
- 常見索引
- 線性索引——排序索引
就是按照某個值排序,這是最最基本的索引了,RDBMS里的聚集索引,別小看這種簡陋的東西,它是大數據里常用甚至是唯一可用的索引。
- 樹形索引——B+索引
這個基本上是DB標配了,可以簡單理解為有序樹再加一堆平衡機制。
- hash索引
這個也越來越的DB支持了,大多碼農都非常熟悉hashmap,沒錯,其實就是這貨。
- 點陣圖索引
這個在少量固定值等特定有時很有用,具體自行搜索了。
- 線性索引——排序索引
- 索引之——機械硬碟/SSD
機械硬碟適用的索引是少seek也就是尋道,多順序掃描scan,如果是樹形索引的話也就是要求樹的深度淺,減少定位(尋道)次數,樹深度淺帶來的問題就是數據切分的不夠小,每個葉子節點會有大量的數據,如果這些葉子節點的數據在物理上是連續的話這將大大有利於機械硬碟的性能。
SSD沒有尋道問題,故可以將數據切分的很細,也就是樹的深度會變大,通過多層定位直接定位到最小範圍的數據集。
- 大卡車or跑車
很多不瞭解的人問我為什麼mapreduce或者hive在數據很少甚至只有一條數據的情況下也要跑幾十秒?我給的回答是傳統的RDBMS是相當於跑車,而大數據相當於超大卡車,即便兩者都空車的情況下大開車也不可能跑過跑車車;我自認為這個比喻很形象的說明瞭兩者的本質上的區別。
其實這也反映出了一個基本的軟體設計理念,吞吐(Throughput)和響應是蹺蹺板的兩端,一遍上去另一邊就得下來。
那麼大數據是靠“大”(堆機器)的傻大黑粗的蠻力Low B技術?NO,其實大數據也有“索引”的概念。
- 大數據有索引?
在RDBMS中索引的概念大家一點都不陌生,但是在大數據里大家似乎沒有聽過所以一說,當然Solr/ES之類的FullText索引並不在這裡所思考的範圍內,這裡思考的還是那些傳統的基礎索引技術;其實很多相同的概念在不同的地方披著不同的外衣。
- 那麼大數據的索引是什麼?
- 數據分區——“分區”索引
“分區”索引一詞屬於自創,其實分區索引是一種特殊的hash索引,hash索引是一種多對一的映射,而分區索引是一對一的映射。
具體表現就是hive表分區。說白了就是按一定規則切分數據,比如按天切分等,這樣將大數據切分成較小的數據,利於程式處理。
- 排序索引——hbase rowkey
排序索引在大數據里典型的就是hbase了,hbase表內的數據全部按照rowkey排序,定位具體行的時候可二分查找定位O(logn),範圍掃描就更有利了;當然前提是得你的rowkey設計得當。
- 數據分區——“分區”索引
大數據用這兩種看似簡陋的索引其實也是無奈,其實對於DB來說只有原始的數據才是“有效載荷”(Payload),其他的數據字典、索引維護的數據都是額外開銷,在RDBMS中不存儲非常大的數據集所以維護這些額外開銷的成本較低,大數據的數據量本身就很大,如果再維護這些額外開銷成本會很高,當然RDBMS在非常大的數據量情況下也有人提出了各種所謂的“反範式化”“反模式”等概念,其中一條就是取消索引……所以同樣的技術在不同的地方的使用場景是不同的甚至披著另外一個外衣。