前面介绍了数序数据的特点, 往往是有大量的维度(dimension)。每个具体的位图, 其可能的取值相对于数据总量来说往往并不多, 但是查询经常涉及到很多维度的组合。举个例子, 假设数据是中国的人口数据, 有一个维度是年龄。 那么这个维度的可能值不会超过150个, 还有一个维度是所在区域, 如果省级区域的话也就三十来个。维度本身的取值不多, 可是查询的时候往往是一种组合。 比如青海省20-30岁之间的人。 那么能快速适应这类查询的技术就是位图索引。 下面介绍一下位图索引。请大家注意, 我们讨论过程假设数据和索引都在内存, 因为如果涉及机械盘的随机IO, 情况就会发生变化。
假设我们有64条数据编号分别为1到64,每条数据都表示一个人口信息, 有这个人的年龄, 所属区域, 性别等属性。那么我们可以对所有在青海地区的人建立一个位图索引。使用一个64为的int, 每一位对应一条数据, 如果这个人是青海的, 对应的位就置1, 否则置0. 然后我们再对这组数据的性别建立位图索引, 同理, 男的置1,女的置0.
现在我们要查询青海地区的男性, 怎么做呢? 只要上面两个位图做&操作就可以了。位图索引可以很方便的完成这些操作, 可是位图索引太大了, 属性值上大部分数据都是0, 所以位图索引可以压缩。好消息是只要压缩方法得当, 压缩后的位图索引仍旧能够进行位操作。 详细信息请查询相关文献(去google 上搜 concise compress)。