- 什么是索引?
索引是什么大家都知道是加快查询用的,是的,没错,索引的根本作用是缩小扫描范围,而不是直接定位记录,直接定位记录只是索引的一种特殊情况,缩小范围之后最终都是线性扫描得到结果。
- 常见索引
- 线性索引——排序索引
就是按照某个值排序,这是最最基本的索引了,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在非常大的数据量情况下也有人提出了各种所谓的“反范式化”“反模式”等概念,其中一条就是取消索引……所以同样的技术在不同的地方的使用场景是不同的甚至披着另外一个外衣。