用户订单列表查询rowkey设计
Ø 需求场景
某用户根据查询条件查询历史订单列表
查询条件有:开始结束时间(orderTime)---必选,
订单号(seriaNum),
状态(status),游戏号(gameid)
结果按照时间倒排序
Ø
rowkey的设计
rowkwy=userNum$orderTime$seriaNum
cf:status,cf:gameid,cf:xxx
Ø 为什么不rowkwy=userNum$gameid$orderTime$issueNum
先看一下mysql(最左前缀原则)
Ø
mysql
create table test(a varchar(10) not null,
b varchar(10) not null,
c varchar(10) not null,
d varchar(10); )
create index idx_complex(a,b,c)
Ø 查询效率(利用好索引,尽量避免回表过滤)
select a,b,c where a=10,b=1,c=10
select xx where a=10,b>1,c=10(x)
select xx where a=10,c=10(x)
select xx where a>10,b=10,c=10(x)
select xx where a>10,b=10(x)
select xx where a=10,b=10,c>10(x)
HBase的索引设计(最左前缀原则)
Ø
HBase的META表 VS mysql的二级索引
rowkey=userNum$orderTime$seriaNum
以下设计是不合理的
rowkey=userNum$gameid$orderTime$issueNum
rowkey=userNum$status$orderTime$issueNum
rowkwy=userNum$orderTime$gameid$issueNum
Ø 查询
rowkey=userNum$orderTime$seriaNum可以唯一标识一条记录
ClientScan的startRow和stopRow只需要设置到userNum$orderTime即可
startRow=userNum$maxvalue-stopTime
stopRow=userNum$maxvalue-startTime
其他字段用filter实现
订单详情rowkey设计
Ø 订单详情是可以根据订单号issumeNum,查看订单的明细
Ø
rowkey=颠倒后的issueNum
因关系数据库中issueNum在设计是按照递增的顺序生成的,
所以在导出到HBase中时,为了分散到各个region中,
减轻对region的压力,所以用颠倒后的issumeNum作为订单详情表的rowkey