Druid原理介绍(1)

       Druid(Druid.io)是一种OLAP工具, 不是阿里的数据库连接池。 所谓OLAP,按我的理解就是实时在线查询。就是说当我需要查询实时和历史数据的时候,能较快的得到响应。这样就出现了一个矛盾了, 在大数据系统中, 由于数据量较大,实时响应非常困难, 那么Druid是如何做到的呢?

      其实Druid的实现原理很简单,就是为保存的数据定时生成位图索引,这样在查询的时候,它就能快速的根据filter条件帅选掉很多不符合条件的数据。下面就来介绍位图索引的原理。

   看下面的数据库表:

ID姓名性别年龄国家
1张三21中国
2李四29法国
3隔壁老王41美国
........................ 
1,000,000玲玲34德国

    现有一个问题, 如何对表建立索引,能快速查找出所有的美国的男性?

    我们知道数据库常用的索引的数据结构是B+树索引(为什么用这种数据结构,网上很多文章)。那么我们能不能对性别和国家建立联合索引呢? 其实对于这个表,即使我们建立了性别+国家的联合索引,在进行这个查询的时候,数据库也不一定会使用这个索引,即使使用效率也不高。为什么呢?因为我们这两列的基数非常低,性别的基数最大是3(男,女,renyao)。国家也只有200多个,这样无论该表有多少行,B+树的叶子节点都比较少,所以查找索引的效率很低, 反而不一定比得上全表扫描。

   那么如何建立索引来解决这个问题呢, 答案是建立位图索引(据我所知,目前oracle支持位图索引,mysql还不支持)。对于该表,位图索引是这样的形式:

   性别的位图索引:

RowId123......1,000,000
101......0
010......1

   国家的位图索引:

            

RowId123......1,000,000
中国100......0
法国010......0
....................

   看出来了吗,其实可以这样理解位图索引:位图索引就是一个hashMap<String, bit[]>, map的key就是属性的取值,value就是指该表中的对应行是否取得就是这个值。以性别为例, 性别一共有两个取值(男, 女)。先看“男”这个取值,由于表中第一行(张三)为男性,索引bit[0]=1, 第二行李四为女性,所以bit[1]=0.依次类推。同理,country也可以建立这样的位图索引。那么位图索引对于解决这个问题有什么帮助呢?当然有帮助, 对于我们前文提到的这个问题,我只需要取出男性对于的bit[]和中国对应的bit[], 然后把这两个bit[]进行与操作,就可以得到一个新的bit[], 而这个bit[]中值为1的位,代表的就是满足条件的行号。

  介绍了位图索引的原理,就很容易得出关于位图索引的三个结论:

  (1) 位图索引比较适用于进行与或非操作的属性;

  (2) 如果某一列的取值的维度比较大,则不太适合建立位图索引。因为位图索引会非常大。例如,假如我们把国家换成ip, 则不太适合建立位图索了。

 (3) 对于需要频繁更新的属性不太适合建立位图索引。对于oracle来说, 更新位图索引的时候需要锁表,会影响效率。

对于OLAP框架而言,(1)和(3)都是满足的,但是(2)就不一定能满足了,因为对于大数据平台而言,某一属性取值范围很大很正常(比如ip),那么如何解决这个问题呢?下篇再说。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值