繁体   English   中英

Hbase排序效率

[英]Hbase Sorting efficiency

在我的Hbasetable中,在第100行的员工名为“ Simon”,在第4000行的员工名为“ Simon”。 现在,我想从Employee表中获取所有名称为“ Simon”的员工。行键是每个员工的SSN。

我的问题是,如果我触发查询以获取所有名称为“ Simon”的员工。Hbase的搜索效率如何? 因为第一个名称“ simon”在行100中,第二个“ simon”名称在4000行中。要获得名称为“ simon”的员工,hbase必须遍历所有表以找出该名称。搜索效率如何,因为我们在这种情况下正在做全表扫描?

如果您必须进行全表扫描(您需要这样做),那将不是一个很好的解决方案。 实际上,如果您有很多行,这将是一个糟糕的解决方案。

大多数关系数据库管理系统(或“ SQL数据库”)为解决此问题所做的就是创建索引 由于您使用的是“ NoSQL数据库”,因此它不会自动为您创建索引。

让我们看一下如何手动创建索引,以便有效地容纳特定类型的查询。


假设你有实体的集合S ,每个实体ES都有一个唯一的密钥K(E)和属性值V(E) 进一步假设您的实体位于HBase表中,每行一个,其中K(E)作为每个实体E的行键。

S相对于V索引是另一张表,通常以以下三种形式之一出现。

索引表1

假设V(E)对于每个实体E也是唯一的。 那么S相对于V索引是一个表,每行一个实体,其中该表具有行键V(E)和一个包含K(E)的列。

要通过V(E)查找实体E ,只需转到该行以查找K(E)

如果您的属性值V(E)是唯一的,请使用此方法。

考虑一下Employee实体表,其中每个员工在公司内都有一个唯一的EmployeeID K(E) Employee表可以使用唯一的EmployeeID作为行键,而Employee_SSN_Index可以使用员工的SSN号V(E) (也是唯一的)。 这可以通过员工的SSN号快速查找员工。

索引表2

假设V(E)对于每个实体E可能不是唯一的; 也就是说,可能有重复项。 那么S相对于V索引是一张表,每行一个实体,其中该表的行键为V(E) ++ K(E)

要查找所有实体EV(E)只要做到这一点与开始行的前缀扫描V(E)

V(E)的长度不固定的情况有一个变体,可能无法区分V(E)结束和K(E)开始的点。 可以在行键中的V(E)K(E)之间放置一个分隔符。 例如V(E) ++ "|" ++ K(E) V(E) ++ "|" ++ K(E) 在这种情况下,要扫描的前缀为V(E) ++ "|"

Employee_Department_Index表可以使用员工工作的DepartmentID作为属性值V(E)

索引表3

假设V(E)对于每个实体E可能不是唯一的; 也就是说,可能有重复项。 然后,相对于VS索引是一个表,该表每行具有一组实体,其中该表具有V(E)的行键和带有限定符K(E)的列族F 也就是说,实体通过属性值分组为行。

要使用V(E)查找所有实体E ,请抓取V(E)行,以请求列族F中的所有列。

实际上,在索引的每一行中的实体数量很少的情况下,应保持这种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM