phoenix查询hbase ,想要走rowkey查询却成了走索引

原创 2018年04月16日 18:49:13

背景: 这是实际项目中遇到的实例,主要涉及到rowkey查询,索引查询 以及主键primary key。问题是在sql使用order by 查询 时遇到的,以下为个人浅见,仅供参考。

内容:

     Hbase中存在数据表如下:

CREATE TABLE IF NOT EXISTS Test.AppLog ( 
 UserId INTEGER NOT NULL,
 Number INTEGER NOT NULL,
 AcType INTEGER NOT NULL,
 Upserttime DATE NOT NULL,
 UploadCount INTEGER NULL,
 Token VARCHAR(50)  NULL,
 IsSuccess BOOLEAN NULL,
 Data VARCHAR NULL,
 ErrorMessage VARCHAR NULL,
 CONSTRAINT pk_TestAppLog
 PRIMARY KEY (UserId, Number, AcType, Upserttime)
 ) default_column_family='apl', SALT_BUCKETS=8;

建立表相应的索引

CREATE INDEX IF NOT EXISTS idx_TestAppLog_Upserttime ON Test.AppLog (Upserttime) 
INCLUDE (UserId, Number, AcType) SALT_BUCKETS=8;

针对上表,当我们使用select * 查询时,是走主键(rowkey)查询的。

eg:

explain select * from Test.AppLog
where userid = 10 and AcType = 2
order by Upserttime desc limit 100;

结果如下:    

 CLIENT 3-CHUNK 4368912 ROWS 943718514 BYTES PARALLEL 3-WAY RANGE SCAN OVER TEST:APPLOG [0,10] - [2,10]  |
|     SERVER FILTER BY ACTYPE = 2                                                                                   |
|     SERVER TOP 100 ROWS SORTED BY [UPSERTTIME DESC]                                                               |
| CLIENT MERGE SORT 

当我们查询具体字段(注意字段变量与索引字段的对应关系)时,如下,却是走了索引查询。

eg:

explain select UserId,AcType,Upserttime from Test.AppLog
where userid = 10 and AcType= 2
order by Upserttime desc limit 100;

结果如下:

CLIENT 8-CHUNK 0 ROWS 0 BYTES PARALLEL 8-WAY REVERSE RANGE SCAN OVER TEST:IDX_TESTAPPLOG_UPSERTTIME [0] - [7] |
|     SERVER FILTER BY FIRST KEY ONLY AND ("USERID" = 10 AND "ACTYPE" = 2)                                            |
|     SERVER 100 ROW LIMIT                                                                                            |
| CLIENT MERGE SORT                                                                                                   |
| CLIENT 100 ROW LIMIT

疑问 : 

 select  * 是走rowkey,select 某些特定字段却是走索引;  当我们去掉 order by的时候,select  * 同样是走rowkey,select 任意字段亦是走rowkey。

原因以及解决办法:

造成该种情况的原因是order by 中的字段(上例中的Upserttime)既是primary key(主键),又是indexes(索引)。

当select 中的字段正好和索引包含的(include)字段一致时,此时phoenix默认会走索引查询。

我们select的字段不与索引包含字段完全一致就不会造成这种情况;因为primary key是主要的,因此可以在建索引时不添加所有字段; 总之 要查询的字段与索引包含字段并不重合 或者没有使用order by 索引字段 即可。

2018-04-16


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haoshuai2015/article/details/79963716

C#LINQ查询技术

-
  • 1970年01月01日 08:00

phoenix为 HBase建立二级索引表

转载:http://blog.csdn.net/u011491148/article/details/45749807 为什么需要Secondary Index 对于HBase而言,如果想...
  • lcg910978041
  • lcg910978041
  • 2016-10-20 20:14:40
  • 811

HBASE+PHOENIX性能优化注解

hbase环境配置优化: 几个配置参数: hbase.hregion.max.filesize: 1)当hbase.hregion.max.filesize比较小时,触发split的机率更大,而sp...
  • lingzhiwangcn
  • lingzhiwangcn
  • 2016-03-11 15:23:44
  • 5241

Phoenix 使用sql查询hbase

http://blog.csdn.net/morning_pig/article/details/8585088 Phoenix优势: 1.动态的将一个查询转换为多个scan并行执...
  • hua840812
  • hua840812
  • 2013-12-30 11:02:38
  • 999

hbase协处理器endpoint应用:hbase数据加盐(Salting)后的数据查询方法

hbase协处理器endpoint应用:hbase数据加盐(Salting)后的数据查询方法 1 介绍   上一篇文章中介绍了hbase数据加盐的方法,并简单介绍了加盐后的数据查询思路,但没有给...
  • finad01
  • finad01
  • 2015-07-11 14:51:51
  • 1342

Hbase 行键设计(rowkey) 实现多条件查询

2018最新编辑 本文写完的时间是2017年初写的,当时对HBASE的理解不深,随着一年多的学习,感觉这篇文章里的方法挺鸡肋的,在我近一年的工作中根本没有用到。 HBASE的使用跟业务逻辑有很强的...
  • alphags
  • alphags
  • 2018-02-08 10:42:51
  • 13751

Phoenix使用总结

对工作中预研Phoenix的使用做一些总结
  • d6619309
  • d6619309
  • 2015-12-19 16:02:48
  • 7227

hbase中根据Rowkey后缀进行查询

假如hbase表设计时,Rowkey设计为“time+uid”(这里不考虑hbase的Rowkey设计合理性,只是简单说明)。现在有一个需求,筛选出某一uid在一个时间段[time1,time2)的值...
  • yuyinghua0302
  • yuyinghua0302
  • 2017-11-23 11:28:05
  • 861

phoenix 如何优化成使用索引进行查询源码分析

phoenix 如何优化成使用索引进行查询源码分析在 phoenix 生成执行计划时,最后会进行执行计划的优化,在优化过程中,会根据当前的sql中有没有hint的 提示使用索引,或者查询中用到了索引...
  • gaoshui87
  • gaoshui87
  • 2016-08-31 16:11:57
  • 1569

HBase phoenix二级索引

1. 为什么需要用二级索引? 对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询。如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄。对于较...
  • lifuxiangcaohui
  • lifuxiangcaohui
  • 2017-02-17 17:52:37
  • 2580
收藏助手
不良信息举报
您举报文章:phoenix查询hbase ,想要走rowkey查询却成了走索引
举报原因:
原因补充:

(最多只允许输入30个字)