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