参考:

Phoenix与HBase集成进行数据分析

HBase查询速度慢原因排查

操作1,执行查询,如下:

  1. : jdbc:phoenix:node3::/hbase> SELECT * FROM ASSET_RECORD WHERE ASSET_ID='设345-1149640126759047168';
  2. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  3. | ID | ASSET_ID | MANAGEMENT_TABLE | INTRODUCTION | MANAGEMENT_ID | |
  4. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  5. | 0292ebbfdf3e4d97a6e9fc930ed126d4 | 345- | ASSET_SEAL | | dd9ff0fc0ad4486bb0812e78fa53ce0e | - |
  6. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  7. row selected (0.081 seconds)

操作2,重复以上查询,如下:

  1. : jdbc:phoenix:node3::/hbase> SELECT * FROM ASSET_RECORD WHERE ASSET_ID='设345-1149640126759047168';
  2. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  3. | ID | ASSET_ID | MANAGEMENT_TABLE | INTRODUCTION | MANAGEMENT_ID | |
  4. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  5. | 0292ebbfdf3e4d97a6e9fc930ed126d4 | 345- | ASSET_SEAL | | dd9ff0fc0ad4486bb0812e78fa53ce0e | - |
  6. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  7. row selected (0.077 seconds)

操作3,使用explain重复以上查询,如下:

  1. : jdbc:phoenix:node3::/hbase> explain SELECT * FROM ASSET_RECORD WHERE ASSET_ID='设345-1149640126759047168';
  2. +----------------------------------------------------------------------------------------------------+-----------------+----------------+--------+
  3. | PLAN | EST_BYTES_READ | EST_ROWS_READ | EST_I |
  4. +----------------------------------------------------------------------------------------------------+-----------------+----------------+--------+
  5. | CLIENT -CHUNK ROWS BYTES PARALLEL -WAY ROUND ROBIN FULL SCAN OVER ASSET_RECORD | | | |
  6. | SERVER FILTER BY ASSET_ID = | | |
  7. +----------------------------------------------------------------------------------------------------+-----------------+----------------+--------+
  8. rows selected (0.015 seconds)

操作4,在表上建索引,如下:

  1. : jdbc:phoenix:node3::/hbase> create index IDX_ASSET_RECORD on ASSET_RECORD(ASSET_ID,MANAGEMENT_TABLE);
  2. , rows affected (6.25 seconds)

操作5,强制使用索引执行查询,如下:

  1. : jdbc:phoenix:node3::/hbase> SELECT /*+ INDEX(ASSET_RECORD IDX_ASSET_RECORD)*/ * FROM ASSET_RECORD WHERE ASSET_ID='设345-1149640126759047168;
  2. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  3. | ID | ASSET_ID | MANAGEMENT_TABLE | INTRODUCTION | MANAGEMENT_ID | |
  4. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  5. | 0292ebbfdf3e4d97a6e9fc930ed126d4 | 设345- | ASSET_SEAL | | dd9ff0fc0ad4486bb0812e78fa53ce0e | - |
  6. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  7. row selected (0.058 seconds)

操作6,强制使用索引执行查询,如下:

  1. : jdbc:phoenix:node3::/hbase> SELECT /*+ INDEX(ASSET_RECORD IDX_ASSET_RECORD)*/ * FROM ASSET_RECORD WHERE ASSET_ID='设345-1149640126759047168';
  2. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  3. | ID | ASSET_ID | MANAGEMENT_TABLE | INTRODUCTION | MANAGEMENT_ID | |
  4. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  5. | 0292ebbfdf3e4d97a6e9fc930ed126d4 | 345- | ASSET_SEAL | | dd9ff0fc0ad4486bb0812e78fa53ce0e | - |
  6. +-----------------------------------+---------------------------+-------------------+---------------+-----------------------------------+--------+
  7. row selected (0.033 seconds)

操作7,使用explain强制使用索引执行查询,如下:

  1. : jdbc:phoenix:node3::/hbase> explain SELECT /*+ INDEX(ASSET_RECORD IDX_ASSET_RECORD)*/ * FROM ASSET_RECORD WHERE ASSET_ID='设345-114964012679047168';
  2. +------------------------------------------------------------------------------------------------------------------+-----------------+-----------+
  3. | PLAN | EST_BYTES_READ | EST_ROWS_ |
  4. +------------------------------------------------------------------------------------------------------------------+-----------------+-----------+
  5. | CLIENT -CHUNK ROWS BYTES PARALLEL -WAY ROUND ROBIN FULL SCAN OVER ASSET_RECORD | null | null |
  6. | SKIP-SCAN-JOIN TABLE | null | null |
  7. | CLIENT -CHUNK PARALLEL -WAY ROUND ROBIN RANGE SCAN OVER IDX_ASSET_RECORD ['设345-1149640126759047168'] | null | null |
  8. | SERVER FILTER BY FIRST KEY ONLY | null | null |
  9. | DYNAMIC SERVER FILTER BY .$) | null | null |
  10. +------------------------------------------------------------------------------------------------------------------+-----------------+-----------+
  11. rows selected (0.045 seconds)

操作8,删除索引,如下:

  1. : jdbc:phoenix:node3::/hbase> drop index IDX_ASSET_RECORD on ASSET_RECORD;
  2. No rows affected (3.688 seconds)

计算操作1和操作2的平均执行时间,建索引后,计算操作5和操作6的平均执行时间,经比较发现使用索引确实提高了查询的速度。

Phoenix具有索引同步更新机制,增删改一条或多条数据以后,索引会自动更新;但是,如果原来的表增加了字段,那就需要更新建在表上的索引。

表的属性越多,条目越多,建索引节约的时间越多,如下是82个属性和195821条记录的表:

  1. : jdbc:phoenix:node3::/hbase> SELECT COUNT(*) FROM ASSET_NORMAL;
  2. +-----------+
  3. | COUNT() |
  4. +-----------+
  5. | |
  6. +-----------+
  7. row selected (4.54 seconds)
  8. : jdbc:phoenix:node3::/hbase> create index IDX_ASSET_NORMAL on ASSET_NORMAL(ASSET_ID,ASSET_NAME,USER_ID);
  9. , rows affected (8.887 seconds)
  10. : jdbc:phoenix:node3::/hbase> SELECT /*+ INDEX(ASSET_NORMAL IDX_ASSET_NORMAL)*/ * FROM ASSET_NORMAL WHERE ASSET_ID='仪1-1151470269278326784';
  11. +-----------------------------------+-------------------------+-------------+------------------------+--------------------------+----------------+
  12. | ID | ASSET_ID | ASSET_NAME | ASSET_FIRST_DEGREE_ID | ASSET_FIRST_DEGREE_NAME | ASSET_SECOND_D |
  13. +-----------------------------------+-------------------------+-------------+------------------------+--------------------------+----------------+
  14. | 002e028151e24b07a21e0a0e9ce7f74c | 1- | 测量仪器 | | 仪表 | |
  15. +-----------------------------------+-------------------------+-------------+------------------------+--------------------------+----------------+
  16. row selected (0.209 seconds)
  17. : jdbc:phoenix:node3::/hbase> SELECT * FROM ASSET_NORMAL WHERE ASSET_ID='仪1-1151470269278326784';
  18. +-----------------------------------+-------------------------+-------------+------------------------+--------------------------+----------------+
  19. | ID | ASSET_ID | ASSET_NAME | ASSET_FIRST_DEGREE_ID | ASSET_FIRST_DEGREE_NAME | ASSET_SECOND_D |
  20. +-----------------------------------+-------------------------+-------------+------------------------+--------------------------+----------------+
  21. | 002e028151e24b07a21e0a0e9ce7f74c | 1- | 测量仪器 | | 仪表 | |
  22. +-----------------------------------+-------------------------+-------------+------------------------+--------------------------+----------------+
  23. row selected (4.306 seconds)

参考:

https://my.oschina.net/puwenchao/blog/1935302

基于Phoenix对HBase建索引的更多相关文章

  1. hbase建索引的两种方式

    转载自http://blog.csdn.net/ryantotti/article/details/13295325 在二级索引的实现技术上一般有几个方案: 1.      表索引 使用单独的hbas ...

  2. Spark教程——(6)Spark-shell基于Phoenix访问HBase数据

    package statistics import common.util.timeUtil import org.apache.spark.{SparkConf, SparkContext} imp ...

  3. phoenix中添加二级索引

    Phoenix创建Hbase二级索引 官方文档 1. 配置Hbase支持Phoenix创建二级索引   1.  添加如下配置到Hbase的Hregionserver节点的hbase-site.xml  ...

  4. phoenix连接hbase数据库,创建二级索引报错:Error: org.apache.phoenix.exception.PhoenixIOException: Failed after attempts=36, exceptions: Tue Mar 06 10:32:02 CST 2018, null, java.net.SocketTimeoutException: callTimeou

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  5. HBase之八--(2):HBase二级索引之Phoenix

    1. 介绍 Phoenix 是 Salesforce.com 开源的一个 Java 中间件,可以让开发者在Apache HBase 上执行 SQL 查询.Phoenix完全使用Java编写,代码位于 ...

  6. 「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践

    Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs对HBase数据进行增删改查,构建二级索引.当然,开源产品嘛,自然需要注意“避坑”啦,阿丸会把使用方式和最佳实践都告 ...

  7. 通过phoenix在hbase上创建二级索引,Secondary Indexing

    环境描述: 操作系统版本:CentOS release 6.5 (Final) 内核版本:2.6.32-431.el6.x86_64 phoenix版本:phoenix-4.10.0 hbase版本: ...

  8. Hadoop生态圈-phoenix(HBase)的索引配置

    Hadoop生态圈-phoenix(HBase)的索引配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 创建索引是为了优化查询,我们可以在phoenix上配置索引方式. 一.修改 ...

  9. Phoenix系列:二级索引(1)

    Phoenix使用HBase作为后端存储,对于HBase来说,我们通常使用字典序的RowKey来快速访问数据,除此之外,也可以使用自定义的Filter来搜索数据,但是它是基于全表扫描的.而Phoeni ...

随机推荐

  1. spring+mybatis报Cannot load JDBC driver

    今天做用maven搭建ssm框架的例子,在测试的时候一直报ava.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 这个异常,找 ...

  2. ASP.NET Core搭建多层网站架构【4-工作单元和仓储设计】

    2020/01/28, ASP.NET Core 3.1, VS2019, Microsoft.EntityFrameworkCore.Relational 3.1.1 摘要:基于ASP.NET Co ...

  3. VMwarePro密钥

    VMware10Pro密钥 5F29M-48312-8ZDF9-A8A5K-2AM0Z VMware12Pro密钥 5A02H-AU243-TZJ49-GTC7K-3C61N VF5XA-FNDDJ- ...

  4. scala基础API

    1.对象和json转换 1.1 json取值 val json:JSONObject = JSON.parseObject(jsonMsg:String)val message:String = js ...

  5. PHP序列化与反序列化(二)

    题目(攻防世界): __construct和__destruct的魔术方法是默认执行的,我们可以忽视他们,__wake up执行以后会返回当前主页上,需要绕过,下面的正则匹配preg_match也需要 ...

  6. spring boot jpa 复杂查询 动态查询 连接and和or 模糊查询 分页查询

    最近项目中用到了jpa,刚接触的时候有些激动,以前的到层忽然不用写sql不用去自己实现了,只是取个方法名就实现了,太惊艳了,惊为天人,但是慢慢的就发现不是这么回事了,在动态查询的时候,不知道怎么操作了 ...

  7. 杭电 2136 Largest prime factor(最大素数因子的位置)

    Largest prime factor Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. Algorightm----DynamicProgramming

    参考资料: 1.  告别动态规划,连刷40道动规算法题,我总结了动规的套路

  9. Math 用法

    console.log(Math.abs(-5)) 取绝对值 console.log(Math.round(5.1)) 取四舍五入 5.5 为中间值 取5 console.log(Math.ceil( ...

  10. if 条件的 true / false 及 select 的值

    if 条件的 true / false 任何不是 false, undefined, null, 0, NaN 的值,或一个空字符串('')在作为条件语句进行测试时实际返回true,因此您可以简单地使 ...