关于hbase二级索引的描述 hbase的二级索引应用( 三 )


4. 根据字段 time 进行时间范围查询:0: jdbc:phoenix:> select count(*) from "operate_log" where "f"."time" between '1538216707720' and '1538223834000';+-----------+| COUNT(1) |+-----------+| 5883 |+-----------+1 row selected (5.241 seconds)(可左右滑动)
这种情况下,基本上查询都在 5s 左右 。这里还要有两点说明:
Phoenix 会自动将表名、字段名都转成大写,如果要区分大小写使用双引号括起来即可 。这里我们创建的是视图,相当于外部表,也可以 create table 创建表,视图的特点是删除时不会删除 HBase 表,但是视图创建的二级索引不会自动更新,如果要实时更新的话,只能使用 create table,然后通过 Phoenix jdbc 的方式写入数据,只有通过 Phoenix 写,然后用 Phoenix 实现的协处理器才能实现实时更新的索引 。使用 Phoenix 创建二级索引1. 使用 Phoenix 对 time 字段创建索引0: jdbc:phoenix:> create index index_operate_log_time on "operate_log" ("f"."time");2,799,827 rows affected (95.814 seconds)(可左右滑动)
2. 再次根据 time 字段做范围查询
00: jdbc:phoenix:> select count(*) from "operate_log" where "f"."time" between '1538216707720' and '1538223834000';+-----------+| COUNT(1) |+-----------+| 5883 |+-----------+1 row selected (0.049 seconds)(可左右滑动)
这里基本上查询都在 50 ms 左右 。这就是通过 Phoenix 的二级索引带来的性能提升 。
Phoenix 索引类型介绍Phoenix 提供了多种索引类型,包括覆盖索引、函数索引,以及全局索引与本地索引等,具体介绍如下 。
Covered Indexes(覆盖索引)覆盖索引是在索引表中直接存储某些常用字段,当查询时所有字段仅涉及索引表中包含的字段时,则无需再在基于 rowkey 索引的数据表中查询,提高了查询的效率 。
比如,我们在operate_log 表 “f”.”time” 列上创建一个索引,并在索引中包含 “f”.”lat”, “f”.”lon” 列:
0: jdbc:phoenix:> create index index_operate_log_time2 on "operate_log" ("f"."time") INCLUDE("f"."lat", "f"."lon");2,799,827 rows affected (133.367 seconds)(可左右滑动)
这样我们做类似如下查询时就可以直接走索引表,以提高查询性能:
0: jdbc:phoenix:> select "f"."lat", "f"."lon" from "operate_log" where "f"."time" between '1538216707720' and '1538223834000' limit 10;(可左右滑动)
Functional Indexes(函数索引)函数索引是在 Phoeinx 4.3 版本之后新增的,它使得索引的建立不仅仅只限于基于列,而可以使用任意的表达式来创建索引,在查询时,如出现相同的表达式查询条件,则会自动优先检索索引表 。
比如,我们在operate_log 表上基于 substr ( “f”.”time”, 1, 10) 创建一个索引:
0: jdbc:phoenix:> create index index_operate_log_time3 on "operate_log" (substr("f"."time", 1, 10));2,799,827 rows affected (94.74 seconds)(可左右滑动)
这样创建索引后,我们就可以使用相同表达式走索引表进行查询优化了,比如:
0: jdbc:phoenix:> select count(*) from "operate_log" where substr("f"."time", 1, 10) between '1538216707' and '1538223834';+-----------+| COUNT(1) |+-----------+| 5886 |+-----------+1 row selected (0.059 seconds)(可左右滑动)
Global Indexes(全局索引)上面的覆盖索引和函数索引都属于全局索引,也是 Phoenix 默认的索引创建模式 。
全局索引将索引表和数据表分开存储,如以上例子中都会创建一张新的索引表,因此每条数据和其索引数据可能会分布在不同的数据节点上,数据表的添加、删除和修改都会更新相关的索引表,所以写入数据时由于额外的网络开销会带来较大的性能消耗 。而查询数据的时候,Phoenix 会通过索引表来快速低损耗的获取数据 。因此全局索引更适合读多写少的使用场景 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: