3.Covered Indexes(覆盖索引)
1.使用覆盖索引获取数据的过程中,内部不需要再去HBase的原表获取数据,查询需要返回的列都会被存储在索引中。要想达到这种效果,你的select的列,where的列都需要在索引中出现。举个例子,如果你的SQL语句是select s2 from hbase_test where s6='13505503576',要最大化查询效率和速度最快,可以建立覆盖索引。
提示要对HBase进行一些配置才能执行该语句。
2.将以下配置增加到hbase-site.xml,通过Cloudera Manager搜索HBase服务的“hbase-site.xml 的 HBase 服务高级配置代码段(安全阀)”。
保存更改,然后重启HBase。
3.在执行建立覆盖索引之前,我们先执行2个查询语句方便后面跟建立索引后的查询时间进行对比。
4.再次执行建立覆盖索引的语句
5.再次执行上面2个查询语句。
发现都是毫秒级返回,而之前2个查询都是需要30几秒。
6.我们再来具体看看建立覆盖索引的语句。
4.Functional Indexes(函数索引)
函数索引从从Phoenix4.3版本就有,这种索引的内容不局限于列,还能在表达式上建立索引。如果你使用的表达式正好就是索引的话,数据也可以直接从这个索引获取,而不需要从数据库获取。
1.在建立函数索引时,我们先执行两个查询语句好方便与建立索引以后的性能进行对比。
2.建立函数索引
3.再次执行前面的查询语句进行比较
如果查询项包含substr(s7,1,10),则查询时间在毫秒级,而之前需要30多秒。如果查询项不包含substr(s7,1,10),则跟不建索引时是一样的。如果想让第一个查询语句走索引,我们可以在建立索引时采用INCLUDE(S7)来实现。
5.Global Indexes(全局索引)
全局索引适合那些读多写少的场景。如果使用全局索引,读数据基本不损耗性能,所有的性能损耗都来源于写数据。数据表的添加、删除和修改都会更新相关的索引表(数据删除了,索引表中的数据也会删除;数据增加了,索引表的数据也会增加)。而查询数据的时候,Phoenix会通过索引表来快速低损耗的获取数据。默认情况下,如果你的查询语句中没有索引相关的列的时候,Phoenix不会使用索引。
6.Local Indexes(本地索引)
本地索引适合那些写多读少,或者存储空间有限的场景。和全局索引一样,Phoenix也会在查询的时候自动选择是否使用本地索引。本地索引之所以是本地,只要是因为索引数据和真实数据存储在同一台机器上,这样做主要是为了避免网络数据传输的开销。如果你的查询条件没有完全覆盖索引列,本地索引还是可以生效。因为无法提前确定数据在哪个Region上,所以在读数据的时候,还需要检查每个Region上的数据而带来一些性能损耗。
1.先删除之前建立的函数索引INDEX2_HBASE_TEST。
可以发现这2个查询语句返回时间都在毫秒级,而如果不建立索引,查询时间为35S以上。
7.总结
Phoenix的二级索引主要有两种,即全局索引和本地索引。全局索引适合那些读多写少的场景。如果使用全局索引,读数据基本不损耗性能,所有的性能损耗都来源于写数据。本地索引适合那些写多读少,或者存储空间有限的场景。
索引定义完之后,一般来说,Phoenix会判定使用哪个索引更加有效。但是,全局索引必须是查询语句中所有列都包含在全局索引中,它才会生效。举个例子,下面是创建索引的语句:
上例就不会用到索引my_index。因为s2并没有包含在索引中。所以使用全局索引,必须要所有的列都包含在索引中。那么怎样才能使用索引呢?有三种方法。
1.创建索引时使用覆盖索引
这种索引会把s2加到索引表里面,同时s2也会随着原数据表中的变化而变化。这种方式很明显的缺点是索引表的大小较大,然后就是全局索引不适合写特别多的情况。
这个查询效果具体可以参考第三章
2.使用类似于Oracle的Hint,强制索引。
如果不带hint,查询时间为35s,带了hint强制使用索引后查询时间为0.099秒。
查询引擎会使用index1_hbase_test这个索引,由于它会发现索引表中没有s5数据,所以每一行它都会去原数据表中获取s5的值。这个强制索引只有在你认为索引有比较好的选择性的时候才是好的选择,也就是说s6等于13505503576的行数不多。不然的话,使用Phoenix默认的全表扫描的性能也许会更好。
3.创建本地索引
本地索引和全局索引不同的是,查询语句中,即使所有的列都不在索引定义中,它也会使用索引,这是本地索引的默认行为。Phoenix知道原数据和索引数据在同一个RegionServer上,能保证索引查找是本地的。本地索引查询效果具体可参见第6章。
注:使用函数索引,查询语句中带上hint也没有作用。
号外:【贡献社区】如何向 Apache Kylin 做贡献,并成为一名 Committer?
Apache Kylin 是第一个由国人主导的 Apache 项目,自2015年从 Apache 孵化器毕业至今已经三年,三年的时间,Kylin社区发展迅速,用户从早期的 eBay、京东、美团等互联网企业逐渐发展到现在国内外各行业上千家企业。
Apache 强调 “Community over code”,只要你长期在社区树立影响力,获得其他人的认可和信任,都可以成为Committer。
众所周知,顶级开源项目历来受到技术业界的普遍认可,成为 Apache Kylin Committer 不仅能提升在技术圈的影响力,也将成为开源软件的“代言人”参与到项目管理中。当然,成为 Committer 是一个荣誉与责任共存的事情,它不是终点,而是一个更高的起点。
目前,Apache Kylin 未来还有大量的创造性工作需要完成,目前在 roadmap上的功能就有:
-
完全使用 spark 的构建和查询引擎
-
支持更多数据源(关系型,非关系型等)
-
支持灵活(Ad-hoc)查询
-
列式存储引擎
-
实时分析引擎及 Lambda 架构
-
容器化(Docker & Kubernetes)
为此我们非常诚挚地欢迎
社区开发者参与到 Kylin 的开发中来
共同打造这一大数据分析领域的神兽!
不想只是Contributor,还想打怪升级成为Committer?
还有点不明白?来 Kylin 社区找我们吧:
http://kylin.apache.org/community/
大家工作学习遇到HBase技术问题,把问题发布到HBase技术社区论坛http://hbase.group,欢迎大家论坛上面提问留言讨论。想了解更多HBase技术关注HBase技术社区公众号(微信号:hbasegroup),非常欢迎大家积极投稿。
Apache Kylin 公众号,介绍Kylin的各种功能,特性以及相关的新闻,活动等。更多信息,请访问Kylin网站:http://kylin.io 相关技术问题,请订阅Apache Kylin邮件列表。
HBase技术交流社区 - 阿里官方“HBase生态+Spark社区大群”点击加入:https://dwz.cn/Fvqv066s