深入浅出 HBase 实战| 青训营笔记

104 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第7天

Phoenix创建视图

  • 将HBase已经存在的表进行映射
  • 名称空间和表名一模一样
  • 列蔟名和列名也必须要一一对应
create view "名称空间"."表名"(
   rowkey对应列名 varchar primary key,
   "列蔟名"."列名" varchar,
);

Phoenix JDBC开发

驱动:PhoenixDriver.class.getName()

JDBC连接URL:jdbc:phoenix:node1.itcast.cn:2181

  1. 加载JDBC驱动
  2. 使用DriverManager获取连接
  3. 准备一个SQL语句
  4. 准备PrepareStatement
  5. 设置参数
  6. 执行语句
  7. 遍历结果
  8. 关闭资源

Phoneix索引的分类

  1. 全局索引

    • 针对整个表,在整个HBase集群中,都是有效的,索引数据会分布在全局
  2. 本地索引

    • 索引数据和表数据存储在一起,方便高效查询
  3. 覆盖索引

    • 将数据直接放入在索引中,直接查询索引就可以将数据查询出来,避免再根据rowkey查询数据
  4. 函数索引

    • 基于一个函数表达式来建立索引,例如: where substr(xxx, 0, 10)....,就可以基于substr(xxx, 0, 10)建立索引

全局索引+覆盖索引

全局索引会独立创建一张HBase的表来保存索引数据,一般经常配合覆盖索引使用。将要查询的列、以及索引列全部的数据保存在索引表中,这样,可以有效避免,查索引之后还要去查询数据表。一次查询,全部搞定。

-- 二、在phoenix中创建二级索引
-- 根据用户ID来查询订单的ID以及对应的支付金额
-- 建立一个覆盖索引,加快查询
create index IDX_USER_ID on ORDER_DTL(C1."user_id") include ("id", C1."money");
​
-- 删除索引
drop index IDX_USER_ID on ORDER_DTL;
​
-- 强制使用索引查询
explain select /*+ INDEX(ORDER_DTL IDX_USER_ID) */ * from ORDER_DTL where "user_id" = '8237476';

本地索引

  • 使用 create local index 索引名称 on 表名(列1, 列2)
  • 本地索引对数据是有侵入性的,就是原先的数据会被编码处理,所以只要创建了本地索引,原先的数据就会隐藏起来
  • 性能提升几十倍、上百倍
  • 当drop掉索引后,数据又可以恢复回来
  • 这些都是由Phoenix的协处理器来实现的